diff options
Diffstat (limited to 'macros/latex/contrib/wargame/source')
59 files changed, 30921 insertions, 0 deletions
diff --git a/macros/latex/contrib/wargame/source/Makefile b/macros/latex/contrib/wargame/source/Makefile new file mode 100644 index 0000000000..656439e408 --- /dev/null +++ b/macros/latex/contrib/wargame/source/Makefile @@ -0,0 +1,334 @@ +# +# +# +NAME := wargame +VERSION := 0.2 +LATEX_FLAGS := -interaction=nonstopmode \ + -file-line-error \ + --synctex=15 \ + -shell-escape +LATEX := pdflatex +MAKEINDEX := makeindex +SED := sed +CTANOMAT := ctan-o-mat +CTANOMAT_FLAGS := -n +SOURCES := wargame.ins \ + wargame.dtx \ + package.dtx \ + util/core.dtx \ + chit/shape.dtx \ + chit/misc.dtx \ + chit/elements.dtx \ + chit/core.dtx \ + hex/shape.dtx \ + hex/tile.dtx \ + hex/ridges.dtx \ + hex/towns.dtx \ + hex/terrain.dtx \ + hex/paths.dtx \ + hex/core.dtx \ + hex/labels.dtx \ + hex/extra.dtx \ + hex/terrain/woods.dtx \ + hex/terrain/town.dtx \ + hex/terrain/tree.dtx \ + hex/terrain/beach.dtx \ + hex/terrain/mountain.dtx \ + hex/terrain/light_woods.dtx \ + hex/terrain/mountains.dtx \ + hex/terrain/village.dtx \ + hex/terrain/city.dtx \ + hex/terrain/swamp.dtx \ + hex/terrain/rough.dtx \ + hex/board.dtx \ + hex/coord.dtx \ + natoapp6c/shape.dtx \ + natoapp6c/symbols.dtx \ + natoapp6c/list.dtx \ + natoapp6c/compat/seasurface.dtx \ + natoapp6c/compat/activity.dtx \ + natoapp6c/compat/subsurface.dtx \ + natoapp6c/compat/missile.dtx \ + natoapp6c/compat/air.dtx \ + natoapp6c/compat/seamine.dtx \ + natoapp6c/compat/land.dtx \ + natoapp6c/compat/equipment.dtx \ + natoapp6c/compat/installation.dtx \ + natoapp6c/compat/space.dtx \ + natoapp6c/frames/hostile.dtx \ + natoapp6c/frames/base.dtx \ + natoapp6c/frames/friendly.dtx \ + natoapp6c/frames/neutral.dtx \ + natoapp6c/frames/unknown.dtx \ + natoapp6c/weaponry.dtx \ + natoapp6c/core.dtx \ + natoapp6c/text.dtx \ + natoapp6c/echelon.dtx \ + natoapp6c/util.dtx \ + tests/map.dtx \ + tests/chits.dtx +SCRIPTS := utils/svg2tikz.py utils/export.py + +DESTDIR := $(HOME)/texmf/ +instdir := tex/latex/$(NAME) +docdir := doc/latex/$(NAME) +srcdir := source/latex/$(NAME) +ctandir := ctan +distsdir := $(NAME)-$(VERSION) + +TILES := beach \ + city \ + light_woods \ + mountains \ + rough \ + swamp \ + town \ + village \ + woods +TABLES := air \ + missile \ + land \ + equipment \ + installation \ + seasurface \ + subsurface \ + seamine \ + space \ + activity +PKG_FILES := wargame.sty \ + tikzlibrarywargame.util.code.tex \ + tikzlibrarywargame.hex.code.tex \ + tikzlibrarywargame.natoapp6c.code.tex \ + tikzlibrarywargame.chit.code.tex \ + wgexport.cls \ + $(TILES:%=%.pdf) + +# beach.png \ +# city.png \ +# mountains.png \ +# sea.png \ +# woods.png \ +# light_woods.png \ +# rough.png \ +# swamp.png \ +# town.png +DOC_FILES := wargame.pdf symbols.pdf compat.pdf + +ifdef VERBOSE +MUTE := +REDIR := +LATEX_FLAGS := +else +MUTE := @ +REDIR := > /dev/null 2>&1 +endif +ifdef CI_COMMIT_REF_NAME +VERSION := $(CI_COMMIT_REF_NAME) +else +ifdef := $(CI_JOB_ID) +endif + +%.aux:%.tex + @echo "LATEX $< -> $@" + $(MUTE)$(LATEX) $(LATEX_FLAGS) $< $(REDIR) + +%.idx:%.dtx + @echo "LATEX $< -> $@" + $(MUTE)$(LATEX) $(LATEX_FLAGS) $< $(REDIR) + +%.aux:%.idx + @echo "LATEX $*.dtx -> $@ (via $<)" + $(MUTE)$(LATEX) $(LATEX_FLAGS) $*.dtx $(REDIR) + $(MUTE)touch $< $@ + +%.pdf:%.aux %.ind + @echo "LATEX $*.dtx -> $@ (via $<)" + $(MUTE)$(LATEX) $(LATEX_FLAGS) $*.dtx $(REDIR) + $(MUTE)touch $^ $@ + +%.pdf:%.aux %.tex + @echo "LATEX $*.tex -> $@ (via $<)" + $(MUTE)$(LATEX) $(LATEX_FLAGS) $*.tex $(REDIR) + +%.pdf:%.tex + @echo "LATEX $< -> $@" + $(MUTE)$(LATEX) $(LATEX_FLAGS) $< $(REDIR) + + +%.ind:%.idx + @echo "INDEX $< -> $@ $<" + $(MUTE)$(MAKEINDEX) -s gind -o $@ $< $(REDIR) + $(MUTE)touch $^ $@ + +%.gls:%.glo + @echo "GLOSSAY $< -> $@" + $(MUTE)$(MAKEINDEX) -s gglo -o $@ $< $(REDIR) + $(MUTE)touch $^ $@ + +all: wargame.pdf + +package: $(PKG_FILES) + +everything: all symbols.pdf compat.pdf tests/test.pdf + +tutorial: tutorial/game.pdf +tutorial/game.pdf: all + $(MUTE)$(MAKE) -C tutorial Game.vmod $(REDIR) + +clean: + @echo "CLEAN" + $(MUTE)rm -f *~ *.log* *.aux *.toc *.lof *.lot *.out *.ilg *.idx *.ind + $(MUTE)rm -f cmp_*.tex *.synctex* *.hd + $(MUTE)rm -f symbols.tex compat.tex testmap.tex testchits.tex + $(MUTE)rm -f wargame.sty wgdoc.sty logo.png logo.pdf + $(MUTE)rm -f symbols.pdf compat.pdf test.pdf wargame.pdf + $(MUTE)rm -f tikzlibrarywargame.util.code.tex + $(MUTE)rm -f tikzlibrarywargame.hex.code.tex + $(MUTE)rm -f tikzlibrarywargame.natoapp6c.code.tex + $(MUTE)rm -f tikzlibrarywargame.chit.code.tex + $(MUTE)rm -f wgexport.cls mksvg.pdf README.md.version + $(MUTE)rm -f $(TILES:%=%.tex) $(TILES:%=%.pdf) + $(MUTE)rm -rf public texmf + $(MUTE)rm -rf $(distsdir) + $(MUTE)rm -f $(distsdir).tar.gz + $(MUTE)rm -f $(distsdir).zip + $(MUTE)rm -f $(NAME).tar.gz + $(MUTE)rm -rf __pycache__ + $(MUTE)rm -rf $(ctandir) tmp + $(MUTE)rm -f ctan.tex $(NAME).ctan.tar.gz + + + +wargame.sty \ +testmap.tex \ +testchits.tex \ +wgdoc.sty \ +compat.tex \ +symbols.tex \ +tikzlibrarywargame.hex.code.tex \ +tikzlibrarywargame.natoapp6c.code.tex \ +tikzlibrarywargame.chit.code.tex \ +wgexport.cls \ +$(TILES:%=%.tex) \ +$(TABLES:%=cmp_%.tex): $(SOURCES) + @echo "DOCSTRIP $<" + $(MUTE)$(LATEX) $< $(REDIR) + +wargame.idx: wargame.dtx wargame.sty $(TILES:%=%.pdf) +wargame.pdf: wargame.aux wargame.ind +fast: wargame.idx +symbols.aux: symbols.tex wargame.sty +compat.aux: compat.tex $(TABLES:%=cmp_%.tex) wargame.sty +test.aux: test.tex wargame.sty + +beach.pdf: beach.tex +city.pdf: city.tex +light_woods.pdf:light_woods.tex +mountains.pdf: mountains.tex +rough.pdf: rough.tex +swamp.pdf: swamp.tex +town.pdf: town.tex +village.pdf: village.tex +woods.pdf: woods.tex + +install-devel: all + (cd $(dir $(DESTDIR)/$(instdir)) && \ + rm -f $(notdir $(instdir)) && \ + ln -fs $(PWD) $(notdir $(instdir))) + +install:$(PKG_FILES) $(DOC_FILES) $(SCRIPTS) + @echo "Installing DESTDIR=$(DESTDIR)" + $(MUTE)mkdir -p $(DESTDIR)$(instdir) + $(MUTE)mkdir -p $(DESTDIR)$(docdir) + $(MUTE)cp $(PKG_FILES) $(DESTDIR)$(instdir) + $(MUTE)cp $(DOC_FILES) $(DESTDIR)$(docdir) + $(MUTE)cp $(SCRIPTS) $(DESTDIR)$(instdir) + +uninstall: + rm -rf $(DESTDIR)$(instdir) + rm -rf $(DESTDIR)$(docdir) + +distdir:$(SOURCES) $(SCRIPTS) Makefile tests/test.tex + $(MUTE)rm -rf $(distsdir) + $(MUTE)mkdir -p $(distsdir) + $(foreach s, $^, \ + mkdir -p $(distsdir)/$(shell dirname $(s)); \ + cp $(s) $(distsdir)/$(s);) + +distcheck:distdir + $(MAKE) $(MAKEFLAGS) -C $(distsdir) everything + +dist:distdir + zip -r $(distsdir).zip $(distsdir) + +bindist: DESTDIR:=$(distsdir)/ +bindist:install + zip -r $(distsdir).zip $(distsdir) + + +logo.png:logo.pdf + pdftocairo -png $< + mv logo-1.png logo.png + +README.md.version:README.md + @echo "Versioned README.md" + $(MUTE)$(SED) 's/^# \(.*\)/# \1\n## Version $(VERSION)/' \ + < $< > $@ + +ctandir: all tutorial/game.pdf README.md.version + @echo "Preparing CTAN directory" + $(MUTE)$(MAKE) install DESTDIR:=tmp/ + $(MUTE)mkdir -p tmp/$(docdir)/tutorial + $(MUTE)cp $(foreach i, game.tex game.sty export.tex patch.py \ + README.md Makefile game.pdf,\ + tutorial/$(i)) tmp/$(docdir)/tutorial + $(MUTE)cp README.md.version tmp/$(docdir)/README.md + $(MUTE)$(MAKE) distdir distsdir:=tmp/$(srcdir) $(REDIR) + $(MUTE)mkdir -p $(ctandir)/$(NAME) + $(MUTE)cp tmp/$(docdir)/README.md $(ctandir)/$(NAME)/ + #$(MUTE)(cd tmp && zip -q -r ../$(ctandir)/$(NAME).tds.zip *) + $(MUTE)(cd tmp && cp -a $(docdir) ../$(ctandir)/$(NAME)/doc) + $(MUTE)(cd tmp && cp -a $(srcdir) ../$(ctandir)/$(NAME)/source) + $(MUTE) rm -rf tmp + +ctan.tex:ctan.tex.in + @echo "SED $< -> $@" + $(MUTE)$(SED) -e 's/@NAME@/$(NAME)/g' \ + -e 's/@VERSION@/$(VERSION)/' \ + < $< > $@ + +ctandist: $(NAME).ctan.tar.gz +$(NAME).ctan.tar.gz: ctandir + @echo "TAR $@" + $(MUTE)rm -f $@ + $(MUTE)(cd $(ctandir) && tar -czf ../$(NAME).ctan.tar.gz *) + $(MUTE)rm -rf $(ctandir) tmp + + +ctan-upload:ctan.tex $(NAME).ctan.tar.gz + @echo "CTAN $< -> CTAN ($(CTANOMAT_FLAGS))" + $(MUTE)$(CTANOMAT) $(CTANOMAT_FLAGS) -c $< + + +docker: + docker run --user root --group-add users -e GRANT_SUDO=yes -it --rm \ + -v $(PWD):/root/$(notdir $(PWD)) texlive/texlive \ + /bin/bash + +docker-prep: + apt update + apt install -y poppler-utils python3-pil \ + libwww-mechanize-perl libfile-copy-recursive-perl + pwd + ls + make clean + +docker-artifacts: DESTDIR=$(PWD)/public/ +docker-artifacts: install tutorial/game.pdf + cp tutorial/game.pdf $(DESTDIR)$(docdir)/tutorial.pdf + cp tutorial/Game.vmod $(DESTDIR)$(docdir)/Game.vmod + + +# +# EOF +# diff --git a/macros/latex/contrib/wargame/source/chit/core.dtx b/macros/latex/contrib/wargame/source/chit/core.dtx new file mode 100644 index 0000000000..7a0189074e --- /dev/null +++ b/macros/latex/contrib/wargame/source/chit/core.dtx @@ -0,0 +1,47 @@ +% \iffalse +% ==================================================================== +% \fi +% +% \subsection{The \texttt{wargame.chit} \TikZ{} library} +% \label{sec:impl:natoapp6c} +% +% We define the library for making chits. We load the hex \TikZ{} +% \spec{wargame.natoapp6c} library and the \textsf{amsmath} and +% \textsf{amstext} packages as we need those. +% +% \iffalse +%<*chit> +% \fi +% +% \begin{macrocode} +\RequirePackage{amsmath} +\RequirePackage{amstext} +\usetikzlibrary{wargame.util,wargame.natoapp6c,math} +% \end{macrocode} +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% +% \subsubsection{Debugging} +% +% \begin{Macro}{\chitdbglvl,\chit@dbg} +% +% Some macros for debugging. Similar to what we have in +% \spec{wargame.hex} (see \sectionname~\ref{sec:impl:hex}. +% +% \begin{macrocode} +\newcount\chitdbglvl\chitdbglvl=\wargamedbglvl +\def\chit@dbg#1#2{% + \ifnum#1>\chitdbglvl\relax\else\message{^^J#2}\fi} +% \end{macrocode} +% \end{Macro} +% +% \input{chit/shape.dtx} +% \input{chit/elements.dtx} +% \input{chit/misc.dtx} +% +% \iffalse +%</chit> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/chit/elements.dtx b/macros/latex/contrib/wargame/source/chit/elements.dtx new file mode 100644 index 0000000000..8708ca2a15 --- /dev/null +++ b/macros/latex/contrib/wargame/source/chit/elements.dtx @@ -0,0 +1,105 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*chit> +% \fi +% +% \subsubsection{Predefined \texttt{chit} element pictures} +% +% \begin{TikzKey}{/tikz/pics/chit/1 factor, +% /tikz/pics/chit/2 factors, +% /tikz/pics/chit/2 factors artillery, +% /tikz/pics/chit/3 factors, +% /tikz/pics/chit/4 factors, +% /tikz/pics/chit/identifier, +% /tikz/pics/chit/small identifier, +% /tikz/pics/chit/identifier macro} +% +% These pictures can be used as the value of \texttt{chit} keys. +% +% \begin{macrocode} +\tikzset{% + chit/1 factor/.pic={ + \chit@dbg{4}{ Chit 1 factor: #1}% + \node[chit/factor,chit/1 factor,pic actions]{#1};}, + pics/chit/2 factors/.style args={#1,#2}{% + code={% + \chit@dbg{4}{ Chit 2 factors: #1 and #2}% + \node[chit/factor,chit/2 factors,pic actions]{#1--#2};}}, + pics/chit/2 factors artillery/.style args={#1,#2,#3}{% + code={ + \chit@dbg{4}{ Chit 2 factors w/artillery: `#1' `#2' `#3'}% + \node[chit/factor,chit/2 factors,pic actions]{% + #1$\overset{\text{\scriptsize #3}}{\text{--}}$#2};}}, + pics/chit/3 factors/.style args={#1,#2,#3}{% + code={ + \chit@dbg{4}{ Chit 3 factors: `#1' `#2' `#3'}% + \node[chit/factor,chit/3 factors,pic actions]{#1-#2-#3};}}, + pics/chit/4 factors/.style args={#1,#2,#3,#4}{% + code={ + \chit@dbg{4}{ Chit 3 factors: `#1' `#2' `#3' `#4'}% + \node[chit/factor,chit/4 factors,pic actions]{#1-#2-#3-#4};}}, + chit/identifier/.pic={ + \chit@dbg{4}{ Chit identifier: `#1'}% + \node[chit/identifier,pic actions]{#1}; + }, + chit/small identifier/.pic={ + \chit@dbg{4}{ Chit small identifier: `#1'}% + \node[chit/small identifier,pic actions]{#1}; + }, + chit/identifier macro/.pic={% + \chit@dbg{4}{ Chit identifier macro: \meaning#1} + \edef\chit@i@tmp{#1} + \node[chit/identifier,pic actions]{\chit@i@tmp};}, +} +% \end{macrocode} +% \end{TikzKey} +% +% \begin{TikzKey}{/tikz/chit/factor, +% /tikz/chit/1 factor, +% /tikz/chit/2 factors, +% /tikz/chit/3 factors, +% /tikz/chit/4 factors, +% /tikz/chit/identifier, +% /tikz/chit/small identifier} +% +% Styles used by the above pictures. Users can change these as they +% see fit. +% +% \begin{macrocode} +\tikzset{% + chit/factor/.style={ + shape=rectangle, + font=\sffamily\bfseries\large, + anchor=base, + inner sep=0, + %text=pgfstrokecolor, + draw=none, + fill=none, + }, + chit/1 factor/.style={}, + chit/2 factors/.style={}, + chit/3 factors/.style={}, + chit/4 factors/.style={text/.append style=\small}, + chit/identifier/.style={ + shape=rectangle, + font=\sffamily\bfseries\scriptsize, + inner sep=0, + % text=pgfstrokecolor, + draw=none, + fill=none, + }, + chit/small identifier/.style={ + shape=rectangle, + font=\sffamily\bfseries\tiny, + inner sep=0, + % text=pgfstrokecolor, + draw=none, + fill=none, + }, +} +% \end{macrocode} +% \end{TikzKey} +% \iffalse +%</chit> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/chit/misc.dtx b/macros/latex/contrib/wargame/source/chit/misc.dtx new file mode 100644 index 0000000000..6c406af3f8 --- /dev/null +++ b/macros/latex/contrib/wargame/source/chit/misc.dtx @@ -0,0 +1,460 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*chit> +% \fi +% \subsubsection{Other pictures} +% Pictures for frame, factors, left, right, and below. +% \begin{macrocode} +\tikzset{ + pics/chit/shade/.style={ + code={% + \path[fill=white,opacity=#1,pic actions] (-.6,-.6) rectangle(.6,.6);}}, + pics/chit/eliminate/.style={ + code={% + \path[fill=red,opacity=#1,pic actions] (-.6,-.6) rectangle(.6,.6);}}, + pics/chit/shade/.default=0.5, + pics/chit/eliminate/.default=0.25, +} +\def\shadechit(#1){% + \pic at (#1) {chit/shade};} +\def\eliminatechit(#1){% + \pic at (#1) {chit/eliminate};} +% \end{macrocode} +% +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% \subsubsection{Stacking of chits} +% +% Stacking of chits. The key \spec{chit/stack direction} sets the +% default direction to make the stack in. +% +% \begin{macrocode} +% offset, location, direction, list +\tikzset{% + chit/stack direction/.store in=\chit@stack@dir, + chit/stack direction/.initial={(.3,.3)}, +} +% \end{macrocode} +% +% Now the code +% +% \begin{macrocode} +\def\chit@stack@dir{(.3,.3)} +\def\stackchits(#1){% + \@ifnextchar({\st@ckchits{#1}}{\st@ckchits{#1}(.3,.3)}%) +} +\def\st@ckchits#1(#2)#3{ + \chit@dbg{2}{Stacking chits `#1', `#2', `#3'} + \edef\xy{#1} + \chit@dbg{4}{Stack start at \xy} + \foreach[count=\i from 0] \c/\o in {#3} {% + \ifx\c\empty\else% + \edef\ccc{\c} + \chit@dbg{2}{Adding \meaning\ccc\space to stack at (\xy)' `\o'} + \expandafter\ccc(\xy) + %% + \ifx\c\o\else + %\chit@dbg{0}{Option: \o} + \edef\ccc{\o} + \expandafter\ccc(\xy) + \fi + \expandafter\ccc(\xy) + \tikzmath{% + coordinate \cc; + \cc = (\xy) + (#2);} + \xdef\xy{\cc} + \fi + } +} +% \end{macrocode} +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% \subsubsection{Making order of battle charts} +% +% +% Macros for making OOBs +% +% Style for turns +% +% \begin{macrocode} +\tikzset{ + chit/oob turn/.pic={\node[pic actions]{#1};}} +% \end{macrocode} +% +% +% current c, current r, n-columns, cell size, y +% +% \begin{macrocode} +\def\chit@oob@cellupdate(#1,#2)#3#4#5{% + \edef\f{\ifwg@oob@inv-1\else1\fi}% + \chit@dbg{1}{ \space Cell update `c=|#1|' vs `#4'*(`#3'-1)} + \pgfmathparse{int(ifthenelse(abs(#1)>=#4*(#3-1),#5-1,#5))}% + \xdef#5{\pgfmathresult} + \pgfmathparse{ifthenelse(abs(#1)>=#4*(#3-1),#2-#4,#2)}% + \xdef#2{\pgfmathresult}% + \pgfmathparse{ifthenelse(abs(#1)>=#4*(#3-1),0,#1+\f*#4)}% + \xdef#1{\pgfmathresult}% + \chit@dbg{1}{ \space\space-> `\string#5'=#5 `\string#2'=#2 `\string#1'=#1} +} +% \end{macrocode} +% +% current c, current r, cell size, extra vertical spacing +% +% \begin{macrocode} +\def\chit@oob@rowupdate(#1,#2)#3#4{% + \chit@dbg{2}{ Row update c=`#1',r=`#2',s=`#3',e=`#4'} + %\pgfmathparse{ifthenelse(#1>0,#2-#3,#2)}% + \pgfmathparse{#2-#3)}% + \xdef#2{\pgfmathresult}% + %\xdef#1{0} + \chit@dbg{2}{ \space\space-> update `\string#2'=#2} +} +% \end{macrocode} +% current c, current r, cell size, extra spacing +% +% \begin{macrocode} +\def\chit@oob@turnupdate(#1,#2)#3#4{% + \chit@dbg{2}{ Turn update c=`#1',r=`#2',s=`#3',e=`#4'} + % \pgfmathparse{#2-ifthenelse(#1>0,#3,0)-#4}% + \pgfmathparse{#2-#4-ifthenelse(abs(#1)>0.0001,#3,0)} + \xdef#2{\pgfmathresult}% + \xdef#1{0}% + \chit@dbg{2}{ \space\space-> update `\string#1'=#1,`\string#2'=#2} +} +% \end{macrocode} +% chit list, n-colls, cell size, extra vertical spacing +% +% This expects a list of lists of chits, one list per turn; the +% maximum number of columns; the size of cells, extra spacing between +% turns. +% +% Note, the list of lists leaf elements should be styles for the +% chits. +% +% This depends on the Tikz pic \texttt{chit/oob~turn} which takes the +% number as argument. +% +% +% \begin{macrocode} +\newif\ifwg@oob@inv\wg@oob@invfalse +\def\wg@star@oob{\wg@oob@invtrue\wg@oob} +\def\wg@nostar@oob{\wg@oob@invfalse\wg@oob} +\def\oob{% + \@ifstar{\wg@star@oob% + }{\wg@nostar@oob% + }% +} +\def\wg@oob#1#2#3#4{ + \def\r{0} + \chit@dbg{1}{OOB: `#1'} + \foreach[count=\ti from 0] \t/\y in #1{ + \xdef\o{\r} + \def\c{0} + \ifx\t\y\def\y{0}\fi + \chit@dbg{1}{Turn \ti\space(\r,\t,y=\y):'} + \ifwg@oob@inv% + \pic at ( .5,\r) {chit/oob turn=\ti};% + \else + \pic at (-.5,\r) {chit/oob turn=\ti};% + \fi% + \ifx\t\empty\else% + \foreach \u/\m in \t{ + %% \chit@dbg{2}{ `\u'=`\m'} + \ifx\u\empty\else + \ifx\m\@empty\def\m{1}\fi + \ifx\u\m\def\m{1}\fi + \foreach \n in {1,...,\m}{% + \ifx\u\chit@blank\else + \chit[\u=\ti,zone point={\u}{\c}{\r}](\c,\r) + \fi + \chit@oob@cellupdate(\c,\r){#2}{#3}{\y} + } + \fi + } + \fi + \chit@dbg{1}{ End of chits in turn + \ti\space(c=`\c',r=`\r',o='\o',y='\y')} + % IF no units where given, then we force \c to be non-zero so that + % \chit@oob@turnupdate increments the row + \ifx\t\@empty + \def\c{#3} + \chit@dbg{2}{ Turn is empty, set c=`\c'} + \fi + %\ifnum\y<0% No explicit number of rows given + % \def\c{#3} + % \chit@dbg{2}{ No explicit number of rows given, set c=`\c'} + %\fi + % In case the user gave and explicit number of rows, add the rows + % that are missing. \y is initially set to the number of + % requested rows, and then decremented every time we go down one + % row. So if the number of rows we did so far is N, and the + % requested number of rows is M, then the loop below adds M-N + % rows. + \ifnum\y>0% + \chit@dbg{2}{ Looping rows from 2 to \y, break when row > \y}% + \foreach \rr in {2,...,\y}{ + %\ifnum\rr>\y% A little funny, but \y can be negative! + % \chit@dbg{2}{ \space Breaking loop \rr\space > \y}% + % \breakforeach% + %\else% + \chit@oob@rowupdate(\c,\r){#3}{#4} + %\fi + } + \fi + % This will zero \c. However, if on entry |\c|>0, then we also + % increment the row + \chit@oob@turnupdate(\c,\r){#3}{#4} + \chit@dbg{1}{End of turn \ti\space(c=`\c',r=`\r',o='\o',y='\y')} + } + \chit@dbg{2}{End of OOB (c=`\c',r=`\r',y=`\y')} +} +% \end{macrocode} +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% \subsubsection{Table of chits} +% +% \begin{macrocode} +\tikzset{ + chit/cell background/.style={fill=black}, + blank chit/.style={/chit/frame={draw=none,fill=none}}, +} +% \end{macrocode} +% +% These macros are used when we set tables of chits. This allows us +% to define blank spaces in the table by giving the element +% \texttt{blank~chit}. +% +% \begin{macrocode} +\def\chit@blank{blank chit} +\def\chit@cellbg(#1,#2)#3{% + \draw[chit/cell background](#1-#3/2,#2-#3/2) rectangle++(#3,#3); +} +% \end{macrocode} +% +% \begin{Macro}{\ifchits@reset} +% +% This `if' controls whether to reset the coordinates to the origin +% when \cs{chits} is called. If true, then reset for a new table. +% +% \begin{macrocode} +\newif\ifchits@reset\chits@resettrue +% \end{macrocode} +% \end{Macro} +% +% \begin{Macro}{\chits,\@chits,\chit@sng@cellupdate} +% \begin{macrocode} +\def\chit@sng@cellupdate(#1,#2)#3#4{% + \chit@dbg{2}{Current `#1' vs `#4'*(`#3'+1)} + \pgfmathparse{ifthenelse(#1>=#4*(#3-1),#2-#4,#2)}% + \xdef#2{\pgfmathresult}% + \pgfmathparse{ifthenelse(#1>=#4*(#3-1),0,#1+#4)}% + \xdef#1{\pgfmathresult}% +} +% \end{macrocode} +% +% The stared version (\cs{chits*}) of this macro continues the +% previously set chit table. +% +% \begin{macrocode} +\def\chits{% + \@ifstar{\chits@resetfalse\@chits}{\chits@resettrue\@chits}} +% \end{macrocode} +% +% \begin{macrocode} +\def\@chits#1#2#3{ + \ifchits@reset + \def\r{0}% + \def\c{0}% + \fi + \chit@dbg{1}{Chits to make: #1}% + \foreach[count=\ti from 0] \t/\x in #1{% + \chit@dbg{2}{Turn `\t' with option `\x'} + \ifx\t\empty\else% + \foreach \u/\m in \t{% + \ifx\u\empty\else% + \chit@dbg{2}{Next chit `\u' with possible multiplicity `\m'}% + \ifx\m\@empty\def\m{1}\fi% + \ifx\u\m\def\m{1}\fi% + \chit@dbg{2}{Next chit `\u' multiplicity `\m'}% + \foreach \n in {1,...,\m}{% + \ifx\u\chit@blank% + \chit@dbg{3}{Ignoring blank chit:\u}% + \else% + \chit@cellbg(\c,\r){#3}% + \chit[\u=\ti](\c,\r)% + \chit@sng@cellupdate(\c,\r){#2}{#3}% + \fi% + }% + \fi% + }% + \fi% + }% +} +% \end{macrocode} +% \end{Macro} +% +% \begin{Macro}{\doublechits, +% \@doublechits, +% \chit@dbl@cellupdate, +% \chit@dbl@flip} +% \begin{enumerate} +% \item coordinates +% \item coordinates +% \item cell-size +% \end{enumerate} +% +% \begin{macrocode} +\def\chit@dbl@flip(#1,#2)#3{% + \pgfmathparse{-#1}% + \xdef\mc{\pgfmathresult}% +} +% \end{macrocode} +% +% \begin{enumerate} +% \item coordinates +% \item coordinates +% \item Number of columns +% \item cell-size +% \end{enumerate} +% +% \begin{macrocode} +\def\chit@dbl@cellupdate(#1,#2)#3#4{% + \pgfmathparse{ifthenelse(#1<-#4/2,#2,#4+#2)}% + \xdef#2{\pgfmathresult}% + \pgfmathparse{ifthenelse(#1<-#4/2,#4+#1,-(#3-.5)*#4)}% + \xdef#1{\pgfmathresult}% +} +% \end{macrocode} +% +% \begin{enumerate} +% \item List of list of keys +% \item Number of columns +% \item size of each cell +% \end{enumerate} +% +% The stared version (\cs{doublechits*}) of this macro continues the +% previously set chit table. +% +% \begin{macrocode} +\def\doublechits{% + \@ifstar{\chits@resetfalse\@doublechits}{\chits@resettrue\@doublechits}} +% \end{macrocode} +% +% \begin{macrocode} +\def\@doublechits#1#2#3{% + \chit@dbg{1}{Setting double-sided chits: #1} + \ifchits@reset + \pgfmathparse{-(#2-.5)*#3} + \xdef\c{\pgfmathresult} + \def\r{0} + \fi + + \foreach[count=\ti from 0] \t/\x in #1{ + \ifx\t\empty\else% + \foreach \u/\m in \t{ + \ifx\u\empty\else + \ifx\m\@empty\def\m{1}\else% + \ifx\u\m\def\m{1}\fi\fi + \chit@dbg{2}{`\u'=`\m' (\c,\r)} + \foreach \n in {1,...,\m}{% + \ifx\u\chit@blank + \chit@dbg{3}{Ignoring blank chit:\u} + \else + \chit@cellbg(\c,\r){#3} + \chit[\u=\ti](\c,\r) + \chit@dbl@flip(\c,\r){#3} + \chit@cellbg(\mc,\r){#3} + \chit[\u\space flipped=\ti,zone turn=\t,zone mult=\n](\mc,\r) + \chit@dbl@cellupdate(\c,\r){#2}{#3} + \fi + } + \fi + } + \fi + } + \draw[dashed](0,-3*#3/4)--(0,\r-#3/4); + \draw[dashed,<-] (#3/5,-2*#3/3)--(#3/2,-2*#3/3) node[anchor=west]{Back}; + \draw[dashed,<-] (-#3/5,-2*#3/3)--(-#3/2,-2*#3/3) node[anchor=east]{Front}; +} +% \end{macrocode} +% \end{Macro} +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% \subsubsection{Some utilities} +% +% +% Game turn marker +% +% \begin{macrocode} +\tikzset{ + number chit/.pic={ + \node[shape=rectangle,font=\sffamily\bfseries\LARGE]{% + \begin{tabular}{c} #1\end{tabular}};}, + game turn/.pic={ + \node[shape=rectangle,font=\sffamily\bfseries]{% + \begin{tabular}{c} Game\\Turn\end{tabular}};}, + game turn/.style={ + /chit/full={game turn}, + color=black, + fill=white}, + game turn flipped/.style={game turn}, + dummy chit/.style={fill=white}, +} +% \end{macrocode} +% +% Marks of chits +% +% \begin{macrocode} +\providecommand\chitmark[2][]{\tikz[scale=.25,#1]{\chit[#2]}} +% \end{macrocode} +% +% Stacking mark +% +% \begin{macrocode} +\tikzset{ + wg stacking/.style={fill=white, + /chit/symbol={[faction=friendly,command=land]}}, +} +\DeclareRobustCommand\stackmark[1][]{% + \tikz[baseline=(current bounding box.center),scale=.3,#1]{ + \stackchits(0,0)(.3,-.3){% + \noexpand\chit[wg stacking], + \noexpand\chit[wg stacking], + \noexpand\chit[wg stacking]}}} +% \end{macrocode} +% +% ZOC mark +% +% \begin{macrocode} +\DeclareRobustCommand\zocmark[1][]{% + \tikz[baseline=(current bounding box.center),scale=.1,#1]{% + \begin{scope}[hex/first row and column are=0, + hex/row direction is=normal, + hex/column direction is=normal, + hex/short columns=none] + \hex[label=,fill=gray](c=1,r=1)% + \hex[label=,fill=white](c=1,r=2)% + \hex[label=,fill=white](c=1,r=0)% + \hex[label=,fill=white](c=0,r=0)% + \hex[label=,fill=white](c=0,r=1)% + \hex[label=,fill=white](c=2,r=1)% + \hex[label=,fill=white](c=2,r=0) + \end{scope}}} +% \end{macrocode} +% +% \begin{macrocode} +\tikzset{ + zone point/.code n args={3}{}} +% \end{macrocode} +% +% \iffalse +%</chit> +% \fi diff --git a/macros/latex/contrib/wargame/source/chit/shape.dtx b/macros/latex/contrib/wargame/source/chit/shape.dtx new file mode 100644 index 0000000000..8ad0614cb8 --- /dev/null +++ b/macros/latex/contrib/wargame/source/chit/shape.dtx @@ -0,0 +1,544 @@ +% \iffalse +% -------------------------------------------------------------------- +% <*chit> +% \fi +% +% \subsubsection{The \texttt{chit} key namespace} +% \begin{TikzKey}{/chit/full, +% /chit/symbol, +% /chit/left, +% /chit/right, +% /chit/upper left, +% /chit/upper right, +% /chit/lower left, +% /chit/lower right, +% /chit/factors, +% /chit/setup, +% /chit/id} +% +% The parts of a chit +% +% \begin{macrocode} +\tikzset{% + /chit/.search also={/tikz}, + /chit/.cd, + full/.store in=\chit@full, full/.initial=,% + symbol/.store in=\chit@symbol, symbol/.initial=,% + left/.store in=\chit@left, left/.initial=,% + unique/.style={/chit/left={#1}},% + right/.store in=\chit@right, right/.initial=,% + parent/.style={/chit/right={#1}},% + upper left/.store in=\chit@upper@left, upper left/.initial=,% + upper right/.store in=\chit@upper@right, upper right/.initial=,% + lower left/.store in=\chit@lower@left, lower left/.initial=,% + lower right/.store in=\chit@lower@right, lower right/.initial=,% + factors/.store in=\chit@factors, factors/.initial=,% + setup/.store in=\chit@setup, setup/.initial=,% + id/.store in=\chit@id, id/.initial=,% + frame/.store in=\chit@frame, frame/.initial=,% +} +% \end{macrocode} +% \end{TikzKey} +% +% \begin{TikzKey}{/tikz/chit/full, +% /tikz/chit/symbol, +% /tikz/chit/left, +% /tikz/chit/right, +% /tikz/chit/upper left, +% /tikz/chit/upper right, +% /tikz/chit/lower left, +% /tikz/chit/lower right, +% /tikz/chit/factors, +% /tikz/chit/setup, +% /tikz/chit/id} +% +% Styles of each element in a chit. Users may override these at their +% own peril. That is, it is OK to override them, but the user should +% be careful. +% +% \begin{macrocode} +\tikzset{ + chit/symbol/.style={scale=.4,transform shape}, + chit/parts/.style={shape=rectangle,transform shape}, + chit/factors/.style={chit/parts,anchor=south}, + chit/left/.style={chit/parts,anchor=south,rotate=90}, + chit/right/.style={chit/parts,anchor=north,rotate=90}, + chit/upper left/.style={chit/parts,anchor=north west}, + chit/upper right/.style={chit/parts,anchor=north east}, + chit/lower left/.style={chit/parts,anchor=south west}, + chit/lower right/.style={chit/parts,anchor=south east}, + chit/setup/.style={chit/parts}, + chit/full/.style={chit/parts}, +} +% \end{macrocode} +% \end{TikzKey} +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% +% \subsubsection{The \texttt{chit} styles} +% +% \begin{TikzKey}{/tikz/chit} +% This key sets up a node to make a chit. The key takes a single +% argument which in turn must contain key--value pairs in the +% \texttt{/chit} (or \texttt{/tikz}) namespace(s). We set the +% \texttt{shape} parameter of the node, and calls the passed keys in +% the \texttt{/chit} namespace to set-up elements of the chit. +% +% \begin{macrocode} +\tikzset{% + chit/.code={% + \pgfkeys{/tikz/transform shape,/tikz/shape=chit} + \pgfkeys{/chit/.cd,#1}}} +% \end{macrocode} +% \end{TikzKey} +% +% We define a counter to set-up unique names for chit nodes. +% +% \begin{macrocode} +\newcounter{chit@id}\setcounter{chit@id}{0} +% \end{macrocode} +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% \subsubsection{The \cs{chit} shape} +% +% \begin{Macro}{\chit@n@to,\@chit@n@to,\@@chit@n@to,\@chit@n@to@} +% +% These macros puts the NATO App6(c) symbol into a chit. The first +% macro takes the identifier and position of the symbol, and then +% scans for options. If no options are given, then we go directly +% to the rendering (\cs{@chit@n@to@}). Otherwise, we may also need +% to scan for an offset given as \parg{delta-x,delta-y}. +% +% \begin{macrocode} +\def\chit@n@to#1#2{% + %% Without a following start square bracket '[' by-pass to final + \chit@dbg{4}{Chit NATO App6(c) first step `#1' `#2'} + \@ifnextchar[{% + %\message{^^JStart square bracket}% + \@chit@n@to{#1}{#2}}{% + %\message{^^JNo start square bracket}% + \@chit@n@to@{#1}{#2}}%]] +} +% \end{macrocode} +% +% The following macro is called if we had no options. +% +% \begin{macrocode} +\def\@chit@n@to@#1#2#3\@end@chit@n@to{% + \chit@dbg{4}{Chit NATO App6(c) w/o offset: + ^^J Options: #3 + ^^J ID: #1 + ^^J Position: #2} + \node[chit/symbol,natoapp6c={#3,id=#1}] (#1) at (#2) {}; + \chit@dbg{4}{Chit NATO App6(c) ended}% +} +% \end{macrocode} +% +% This is called if we had an option-like argument. Check if we have +% an offset +% +% \begin{macrocode} +\def\@chit@n@to#1#2[#3]{% + \chit@dbg{4}{Chit NATO App6(c) second step `#1' `#2' `#3'} + \@ifnextchar({\@@chit@n@to{#1}{#2}{#3}}{\@@chit@n@to{#1}{#2}{#3}(0,0)}%) +} +% \end{macrocode} +% +% This called if we had option-like argument. +% +% \begin{macrocode} +\def\@@chit@n@to#1#2#3(#4)\@end@chit@n@to{% + \chit@dbg{4}{Chit NATO App6(c) w/offset: + ^^J Options: #3 + ^^J ID: #1 + ^^J Position: #2 + ^^J Offset: #4} + \node[chit/symbol,natoapp6c={#3,id=#1}] (#1) at ($(#2)+(#4)$) {};} +% \end{macrocode} +% \end{Macro} +% +% \begin{Macro}{\chit@tr@ns@nchor,\chit@nchor} +% +% Get anchor of sub-symbol element in chit. We need to do this, +% because the symbol is translated and scaled. +% +% \begin{macrocode} +\def\chit@tr@ns@nchor#1{% + \pgf@x=0.4\pgf@x% + \pgf@y=0.4\pgf@y\advance\pgf@y#1} +% \end{macrocode} +% +% \begin{macrocode} +\def\chit@nchor#1#2#3{% + \wg@sub@nchor{#1}{#2} + \chit@tr@ns@nchor{#3}} +\def\chit@report{} +\tikzset{ + zone turn/.style={}, + zone mult/.style={} +} +% \end{macrocode} +% \end{Macro} +% +% Now follows the actual \text{chit} shape. This is rather long, so +% we will break it up a bit +% +% +% The first thing is we declare some saved anchors. These are +% computed (and defined as internal macros) when the shape is +% instantised. The anchors give the centre and north east corner of +% the node, the place to put the NATO App6(c) symbol and factors. We +% also set a dimension for the margins (corner and factors elements). +% +% \begin{macrocode} +\pgfdeclareshape{chit}{ + \savedanchor\center{\pgf@x=0cm\pgf@y=0cm} + \savedanchor\northeast{\pgf@x=0.6cm\pgf@y=0.6cm} + \savedanchor\symbol{\pgf@x=0cm\pgf@y=0.2cm} + \savedanchor\factors{\pgf@x=0cm\pgf@y=-0.5cm} + \saveddimen\margin{\pgf@x=0.04cm} +% \end{macrocode} +% +% Next, we define some saved macros. These are called (and declares +% internal macros) when the shape is instantised. We define macros +% for the identifier, +% +% +% \begin{macrocode} + \savedmacro\id{% + \chit@dbg{4}{Chit ID: \meaning\chit@id}% + \@ifundefined{chit@id}{\let\chit@id\pgfutil@empty}{}% + \ifx\chit@id\pgfutil@empty% + \wg@r@ndom@id% + \edef\id{chit\wg@uuid}% + \else% + \edef\id{\chit@id}% + \fi% + \chit@dbg{4}{Chit ID stored: \meaning\chit@id} + } + \savedmacro\chitframeopt{% + \let\chitframeopt\pgfutil@empty% + \@ifundefined{chit@frame}{}{% + \edef\chitframeopt{\chit@frame}} + \n@to@pp@dbg{3}{Chit Frame options: \meaning\chitframeopt}% + } +% \end{macrocode} +% +% We define the regular anchors of the shape. That is, the centre, +% corners, and edges. +% +% \begin{macrocode} + \anchor{center}{\center} + \anchor{north east}{\northeast} + \anchor{north west}{\northeast\pgf@x=-\pgf@x} + \anchor{south west}{\northeast\pgf@x=-\pgf@x\pgf@y=-\pgf@y} + \anchor{south east}{\northeast\pgf@y=-\pgf@y} + \anchor{north} {\northeast\pgf@x=0cm} + \anchor{south} {\northeast\pgf@x=0cm\pgf@y=-\pgf@y} + \anchor{east} {\northeast\pgf@y=0cm} + \anchor{west} {\northeast\pgf@x=-\pgf@x\pgf@y=0cm} +% \end{macrocode} +% +% Next, we want to be able to reference the symbol anchors too. So we +% define these anchors from the embedded node anchors. Note, these +% anchors will not exist if the chit is made with +% \texttt{full=}\meta{args}. +% +% \begin{macrocode} + \anchor{symbol north east}{\chit@nchor{M\id symbol}{north east}{0.2cm}} + \anchor{symbol north west}{\chit@nchor{M\id symbol}{north west}{0.2cm}} + \anchor{symbol south east}{\chit@nchor{M\id symbol}{south east}{0.2cm}} + \anchor{symbol south west}{\chit@nchor{M\id symbol}{south west}{0.2cm}} + \anchor{symbol north} {\chit@nchor{M\id symbol}{north}{0.2cm}} + \anchor{symbol west} {\chit@nchor{M\id symbol}{west}{0.2cm}} + \anchor{symbol south} {\chit@nchor{M\id symbol}{south}{0.2cm}} + \anchor{symbol east} {\chit@nchor{M\id symbol}{east}{0.2cm}} + \anchor{symbol upper} {\chit@nchor{M\id symbol}{upper}{0.2cm}} + \anchor{symbol lower} {\chit@nchor{M\id symbol}{lower}{0.2cm}} + \anchor{symbol left} {\chit@nchor{M\id symbol}{left}{0.2cm}} + \anchor{symbol right} {\chit@nchor{M\id symbol}{right}{0.2cm}} + \anchor{symbol echelon} {\chit@nchor{M\id symbol}{north}{0.2cm}} + \anchor{symbol below} {\chit@nchor{M\id symbol}{south}{0.1cm}} +% \end{macrocode} +% +% Some anchors to sub-elements. Some of them only exists if we have +% NATO App6(c) symbol in the chit. +% +% \begin{macrocode} + \anchor{symbol} {\symbol} + \anchor{factors} {\factors} + \anchor{left} {\chit@nchor{M\id symbol}{west}{.2cm}\advance\pgf@x-\margin} + \anchor{right}{\chit@nchor{M\id symbol}{east}{.2cm}\advance\pgf@x+\margin} + \anchor{upper right} {% + \northeast \advance\pgf@x-\margin \advance\pgf@y-\margin% + } + \anchor{upper left}{ + \northeast \advance\pgf@x-\margin \advance\pgf@y-\margin \pgf@x=-\pgf@x% + } + \anchor{lower right} {% + \northeast \advance\pgf@x-\margin \advance\pgf@y-\margin \pgf@y=-\pgf@y% + } + \anchor{lower left}{ + \northeast \advance\pgf@x-\margin \advance\pgf@y-\margin% + \pgf@x=-\pgf@x \pgf@y=-\pgf@y% + } +% \end{macrocode} +% +% Now for the actual path. For the background path, we simply specify +% the frame. This is so that this will get drawn (and possibly +% filled) using the appropriate options. +% +% \begin{macrocode} + \backgroundpath{% + %% This is the outline of the chit only. The rest of the chit is + %% made on the foreground "path". + \northeast% + \wg@tmpa=\pgf@x\wg@tmpb=\pgf@y% + \pgfpathmoveto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}% + \wg@tmpa=-\wg@tmpa \pgfpathlineto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}% + \wg@tmpb=-\wg@tmpb \pgfpathlineto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}% + \wg@tmpa=-\wg@tmpa \pgfpathlineto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}% + \pgfclosepath + } +% \end{macrocode} +% +% Finally, we make the foreground rendered path. This is where we do +% the most stuff. We do it in the \emph{behind} foreground path so +% that we can ensure things are drawn the way we want it. +% +% The first thing is to set-up the clipping to the chit frame. +% +% \begin{macrocode} + \behindforegroundpath{% + \chit@dbg{4}{% + Chit foreground: \meaning\id + ^^J ID (set): \meaning\chit@id + ^^J Symbol: \meaning\chit@symbol + ^^J Full: \meaning\chit@full + ^^J Factors: \meaning\chit@factors + ^^J Left: \meaning\chit@left + ^^J Right: \meaning\chit@right + ^^J Upper left: \meaning\chit@upper@left + ^^J Lower left: \meaning\chit@lower@left + ^^J Upper right: \meaning\chit@upper@right + ^^J Lower right: \meaning\chit@lower@right} + \chit@report{} + \pgfscope + % + \northeast% + \wg@tmpa=\pgf@x\wg@tmpb=\pgf@y% + \pgfpathmoveto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}% + \wg@tmpa=-\wg@tmpa \pgfpathlineto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}% + \wg@tmpb=-\wg@tmpb \pgfpathlineto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}% + \wg@tmpa=-\wg@tmpa \pgfpathlineto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}% + \pgfclosepath + \pgfusepath{clip} +% \end{macrocode} +% +% If we do not have the \texttt{symbol} key set, then we set the +% \texttt{full} key as a picture. +% +% \begin{macrocode} + \@ifundefined{chit@symbol}{% + %% Draw full stuff + \@ifundefined{chit@full}{}{% + \center\wg@tmpa=\pgf@x\wg@tmpb=\pgf@y% + \wg@pic@all{\chit@full}{}{\the\wg@tmpa,\the\wg@tmpb}{chit/full}}% + }{% +% \end{macrocode} +% +% Otherwise, we put in a node with shape \texttt{natoapp6c} and pass +% the \texttt{symbol} key--value pairs as options. +% +% \begin{macrocode} + \edef\symid{\id symbol}% + \symbol% + \edef\args{{\symid}{\the\pgf@x,\the\pgf@y}\chit@symbol}% + \chit@dbg{6}{Arguments to chit NATO symbol: \meaning\args}% + \expandafter\chit@n@to\args\@end@chit@n@to% + \chit@dbg{6}{After making NATO symbol in chit}% +% \end{macrocode} +% +% Having made the NATO App6(c) symbol, which we gave the node name +% \meta{id}\texttt{symbol} where \meta{id} is the ID of this chit, we +% can make the rest of the chit elements. These are the left and +% right elements, which are set west and east of the symbol, +% respectively; the factors; and the four corner elements. +% +% If the respective elements have not been specified, we do not make +% them. +% +% First the left and right elements. Note that these uses the anchors +% of the embedded \texttt{natoapp6c} node for placement. +% +% \begin{macrocode} + % Put in left of symbol + \@ifundefined{chit@left}{}{% + \begin{scope}[] + \pgfpointanchor{\symid}{west}% + \wg@tmpa=\pgf@x\advance\wg@tmpa-\margin% + \wg@tmpb=\pgf@y% + \wg@pic@all{\chit@left}{}{\the\wg@tmpa,\the\wg@tmpb}{chit/left}% + \end{scope}}% + % Put in right of symbol + \@ifundefined{chit@right}{}{% + \begin{scope}[] + \pgfpointanchor{\symid}{east}% + \wg@tmpa=\pgf@x\advance\wg@tmpa+\margin% + \wg@tmpb=\pgf@y% + \wg@pic@all{\chit@right}{}{\the\wg@tmpa,\the\wg@tmpb}{chit/right}% + \end{scope}}% +% \end{macrocode} +% +% Next, we want to put in the corner elements. But before we do +% that, we use our saved anchors and dimensions to calculate the +% coordinates. Note that the corner elements are anchored to the +% corners (plus margin) of the chit frame. +% +% \begin{macrocode} + % Get coordinates + \northeast% + \wg@tmpa=\pgf@x% + \wg@tmpb=\pgf@y% + \advance\wg@tmpa-\margin% + \advance\wg@tmpb-\margin% +% \end{macrocode} +% +% With the coordinates extracted, we set the four corner +% elements. Note, for the anchoring to work, we should specify +% pictures that have anchors (e.g., nodes). If not, we must take care +% to give offsets or the like. +% +% \begin{macrocode} + % Put in upper left corner + \@ifundefined{chit@upper@left}{}{% + \begin{scope}[] + \wg@pic@all{\chit@upper@left}{}{-\the\wg@tmpa,\the\wg@tmpb}{% + chit/upper left}% + \end{scope}} + % Put in upper right corner + \@ifundefined{chit@upper@right}{}{% + \begin{scope}[] + \wg@pic@all{\chit@upper@right}{}{\the\wg@tmpa,\the\wg@tmpb}{% + chit/upper right}% + \end{scope}} + % Put in lower left corner + \@ifundefined{chit@lower@left}{}{% + \begin{scope}[] + \wg@pic@all{\chit@lower@left}{}{-\the\wg@tmpa,-\the\wg@tmpb}{% + chit/lower left}% + \end{scope}} + % Put in lower right corner + \@ifundefined{chit@lower@right}{}{% + \begin{scope}[] + \wg@pic@all{\chit@lower@right}{}{\the\wg@tmpa,-\the\wg@tmpb}{% + chit/lower right}% + \end{scope}} +% \end{macrocode} +% +% Finally, we put in the unit factors. They are put at the bottom of +% the chit frame (plus margin) and are typically anchored to the south +% anchor of the element. Note, we can put in several factors if need +% be. +% +% \begin{macrocode} + % Put in factors + \@ifundefined{chit@factors}{}{% + \advance\wg@tmpb-\margin% + \begin{scope}[] + \wg@pic@all{\chit@factors}{}{0,-\the\wg@tmpb}{chit/factors}% + \end{scope}}% + }% + \endpgfscope% + % Draw frame? + \edef\tmp@opt{[\chitframeopt]} + \expandafter\scope\tmp@opt + \northeast% + \wg@tmpa=\pgf@x\wg@tmpb=\pgf@y% + \pgfpathmoveto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}% + \wg@tmpa=-\wg@tmpa \pgfpathlineto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}% + \wg@tmpb=-\wg@tmpb \pgfpathlineto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}% + \wg@tmpa=-\wg@tmpa \pgfpathlineto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}% + \pgfclosepath + \pgfusepath{stroke} + \endscope + } +} +% \end{macrocode} +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% \subsubsection{The \cs{chit} wrapper macro} +% +% \begin{Macro}{\chit,\chit@,\chit@@} +% +% The macro to make the chits. This is a wrapper around a +% \texttt{node} with shape \texttt{chit}. The syntax of this macro +% is +% +% \begin{Syntax} +% \cs{chit}\oarg{chit options}\parg{position}\parg{identifier}; +% \end{Syntax} +% +% Note that the trailing semi-colon is optional. Here \meta{chit +% options} are any key-value pairs in the \texttt{/chit} (and +% \texttt{/tikz}) namespace. +% +% The first macro parses for options. +% +% \begin{macrocode} +\def\chit{% + \chit@dbg{5}{Chit} + \@ifnextchar[{\chit@}{\chit@[]}%] +} +% \end{macrocode} +% +% Parse for coordinates. +% +% \begin{macrocode} +\def\chit@[#1]{% + \chit@dbg{5}{Chit second: `#1'} + \@ifnextchar({\chit@@{#1}}{\chit@@{#1}(0,0)}%) +} +% \end{macrocode} +% +% Parse for name. +% +% \begin{macrocode} +\def\chit@@#1(#2){% + \@ifnextchar({\chit@@@{#1}{#2}}{\chit@@@{#1}{#2}()}%) +} +% \end{macrocode} +% +% The work horse. This simply makes a \cs{node} with the shape +% \texttt{chit}. Note, we allow for a trailing semi-colon +% (\texttt{;}) to have a similar feel to other \TikZ{} macros. +% +% \begin{macrocode} +\def\chit@@@#1#2(#3){% + \chit@dbg{5}{Chit final: + ^^J Options: #1 + ^^J Position: #2 + ^^J Name: `#3'} + \let\name\pgfutil@empty% + \chit@dbg{1}{=== Before chit node}% + \node[draw,chit={every chit/.try,id=#3,#1}] (tmp) at (#2) {}; + \chit@dbg{2}{=== After chit node}% + \ifx|#3|\relax% + \else% + \chit@dbg{3}{=== Renaming chit to user defined name `#3'}% + \pgfnoderename{#3}{tmp}% + \fi% + \@ifnextchar;{\@gobble}{}% +} +% \end{macrocode} +% \end{Macro} +% \iffalse +% </chit> +% -------------------------------------------------------------------- +% \fi 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 diff --git a/macros/latex/contrib/wargame/source/hex/coord.dtx b/macros/latex/contrib/wargame/source/hex/coord.dtx new file mode 100644 index 0000000000..b996ffa3c2 --- /dev/null +++ b/macros/latex/contrib/wargame/source/hex/coord.dtx @@ -0,0 +1,350 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*hex> +% \fi +% +% \subsubsection{Hex coordinate system} +% +% \begin{Macro}{\hex@xx,\hex@yy} +% +% Some offsets along $x$ and $y$ due to offset of every second hex +% column. +% +% \begin{align*} +% \delta_x &= \cos60^{\circ}\\ +% \delta_y &= \sin60^{\circ}\\ +% \end{align*} +% +% These numbers are calculated once here and then used several times +% in the following code. +% +% \begin{macrocode} +\pgfmathparse{cos(60)} \xdef\hex@xx{\pgfmathresult} +\pgfmathparse{sin(60)} \xdef\hex@yy{\pgfmathresult} +\pgfmathparse{\hex@yy*cos(30)}\xdef\hex@e@xx{\pgfmathresult} +\pgfmathparse{\hex@yy*sin(30)}\xdef\hex@e@yy{\pgfmathresult} +\newdimen\hex@radius\hex@radius=1cm +\newdimen\hex@dx \expandafter\hex@dx=\hex@xx cm +\newdimen\hex@dy \expandafter\hex@dy=\hex@yy cm +\newdimen\hex@e@dx \expandafter\hex@e@dx=\hex@e@xx cm +\newdimen\hex@e@dy \expandafter\hex@e@dy=\hex@e@yy cm + +% \end{macrocode} +% \end{Macro} +% +% Some code we need for some options +% +% \begin{macrocode} +\newif\ifhex@label@is@name\hex@label@is@namefalse +\def\hex@short@col{isfalse} +\def\hex@got@short{isfalse} +\pgfmathdeclarefunction{isfalse}{1}{% + \begingroup + \def\pgfmathresult{0}% + \pgfmath@smuggleone\pgfmathresult + \endgroup} +\pgfmathdeclarefunction{istrue}{1}{% + \begingroup + \def\pgfmathresult{1}% + \pgfmath@smuggleone\pgfmathresult + \endgroup} +% \end{macrocode} +% +% What follows is a way to configure the hex coordinate system. For +% example, if the rows goes down, then we can flag that, but still add +% hexes straightforwardly. Similar for columns. We can also specify +% that the first row or column has number 1 (instead of 0). Since +% this is dealt with a the coordinate level, it means most of the rest +% of the code is agnostic to these choices. +% +% Which is the first coordinate (0 or 1) +% +% \begin{macrocode} +\tikzset{ + hex/first row is/.is choice, + hex/first row is/0/.code={\def\hex@coords@row@off{0}}, + hex/first row is/1/.code={\def\hex@coords@row@off{-1}}, + hex/first row is=0, + hex/first column is/.is choice, + hex/first column is/0/.code={\def\hex@coords@col@off{0}}, + hex/first column is/1/.code={\def\hex@coords@col@off{-1}}, + hex/first column is=0, + hex/first row and column are/.is choice, + hex/first row and column are/0/.style={ + hex/first row is=0,% + hex/first column is=0}, + hex/first row and column are/1/.style={ + hex/first row is=1,% + hex/first column is=1}, +% \end{macrocode} +% +% Which way does the column and row numbers go +% +% \begin{macrocode} + hex/row direction is/.is choice, + hex/row direction is/normal/.code={\def\hex@coords@row@fac{1}}, + hex/row direction is/reversed/.code={\def\hex@coords@row@fac{-1}}, + hex/row direction is/up/.style={hex/row direction is=normal}, + hex/row direction is/down/.style={hex/row direction is=reversed}, + hex/row direction is/positive/.style={hex/row direction is=normal}, + hex/row direction is/negative/.style={hex/row direction is=reversed}, + hex/row direction is=normal, + hex/column direction is/.is choice, + hex/column direction is/normal/.code={\def\hex@coords@col@fac{1}}, + hex/column direction is/reversed/.code={\def\hex@coords@col@fac{-1}}, + hex/column direction is/right/.style={hex/column direction is=normal}, + hex/column direction is/left/.style={hex/column direction is=reversed}, + hex/column direction is/positive/.style={hex/column direction is=normal}, + hex/column direction is/negative/.style={hex/column direction is=reversed}, + hex/column direction is=normal, +% \end{macrocode} +% +% Make labels names of shapes of the hexes so we can use labels to +% place stuff +% +% \begin{macrocode} + hex/label is name/.is if=hex@label@is@name, +% \end{macrocode} +% +% If we have uneven number of rows in some columns. +% +% \begin{macrocode} + hex/short bottom columns/.is choice, + hex/short bottom columns/odd/.code={% + \def\hex@bot@short@col{isodd} + \def\hex@got@bot@short{istrue} + \hex@dbg{4}{Short columns (odd): \meaning\hex@bot@short@col}}, + hex/short bottom columns/even/.code={ + \def\hex@bot@short@col{iseven} + \def\hex@got@bot@short{istrue} + \hex@dbg{4}{Short column (even): \meaning\hex@bot@short@col}}, + hex/short bottom columns/none/.code={ + \def\hex@bot@short@col{isfalse} + \def\hex@got@bot@short{isfalse} + \hex@dbg{4}{Short columns (none): \meaning\hex@bot@short@col}}, + hex/short bottom columns=none, + hex/short columns/.forward to=hex/short bottom columns, + hex/short top columns/.is choice, + hex/short top columns/odd/.code={% + \def\hex@top@short@col{isodd} + \def\hex@got@top@short{istrue} + \hex@dbg{4}{Short columns (odd): \meaning\hex@top@short@col}}, + hex/short top columns/even/.code={ + \def\hex@top@short@col{iseven} + \def\hex@got@top@short{istrue} + \hex@dbg{4}{Short column (even): \meaning\hex@top@short@col}}, + hex/short top columns/none/.code={ + \def\hex@top@short@col{isfalse} + \def\hex@got@top@short{isfalse} + \hex@dbg{4}{Short columns (none): \meaning\hex@top@short@col}}, + hex/short top columns=none, +} +\message{^^JInitial hex coordinate setup: + Rows: factor=\hex@coords@row@fac, offset=\hex@coords@row@off + Columns: factor=\hex@coords@col@fac, offset=\hex@coords@col@off} +% \end{macrocode} +% +% \begin{HexKey*}{ +% hex/coords/column, +% hex/coords/row, +% hex/coords/vertex, +% hex/coords/edge, +% hex/coords/offset} +% +% We define the keys for hexagon coordinates. These are the +% \spec{row}, \spec{column}, possible \spec{vertex} or +% \spec{edge}. Vertexes and edges are defined as +% multiple-choice. \spec{offset} specifies the offset from the +% centre in the direction of a vertex or edge. By default, the +% offset is one, meaning all the way to the vertex or edge. +% +% The key \spec{inverse row} specifies that the rows are given from +% the top down, but coordinates should be calculated as if the row +% was negative. This (should) allow us to design boards where rows +% increase downward, while still keeping the interface and remaining +% code somewhat reasonable and agnostic. +% +% Similarly, the key \spec{column 1}, will allow us to start the +% columns with 1. +% +% +% +% \begin{macrocode} +\tikzset{ + /hex/coords/.cd, + column/.store in=\hex@col, + c/.store in=\hex@col, + row/.store in=\hex@row, + r/.store in=\hex@row, + offset/.store in=\hex@off, + o/.store in=\hex@off, + vertex/.is choice, + vertex/none/.code={\global\let\hex@vtx\@empty}, + vertex/east/.code={\def\hex@vtx{0}}, + vertex/north east/.code={\def\hex@vtx{60}}, + vertex/north west/.code={\def\hex@vtx{120}}, + vertex/west/.code={\def\hex@vtx{180}}, + vertex/south west/.code={\def\hex@vtx{240}}, + vertex/south east/.code={\def\hex@vtx{300}}, + vertex/E/.code={\def\hex@vtx{0}}, + vertex/NE/.code={\def\hex@vtx{60}}, + vertex/NW/.code={\def\hex@vtx{120}}, + vertex/W/.code={\def\hex@vtx{180}}, + vertex/SW/.code={\def\hex@vtx{240}}, + vertex/SE/.code={\def\hex@vtx{300}}, + vertex/.default=none, + v/.forward to=/hex/coords/vertex=#1, + edge/.is choice, + edge/none/.code={\global\let\hex@edg\@empty}, + edge/north east/.code={\def\hex@edg{30}}, + edge/north/.code={\def\hex@edg{90}}, + edge/north west/.code={\def\hex@edg{150}}, + edge/south west/.code={\def\hex@edg{210}}, + edge/south/.code={\def\hex@edg{270}}, + edge/south east/.code={\def\hex@edg{330}}, + edge/NE/.code={\def\hex@edg{30}}, + edge/N/.code={\def\hex@edg{90}}, + edge/NW/.code={\def\hex@edg{150}}, + edge/SW/.code={\def\hex@edg{210}}, + edge/S/.code={\def\hex@edg{270}}, + edge/SE/.code={\def\hex@edg{330}}, + edge/.default=none, + e/.forward to=/hex/coords/edge, +} +% \end{macrocode} +% \end{HexKey*} +% +% \begin{Macro}{\hex@coords@reset} +% +% This macro resets the hex coordinates to default values. That is +% row and column 0, no vertex or edge. +% +% \begin{macrocode} +\def\hex@coords@reset{% + \tikzset{% + /hex/coords/.cd, + column=0, + row=0, + edge=none, + vertex=none, + offset=1}} +% \end{macrocode} +% \end{Macro} +% +% The following calculates the Cartesian coordinates from Hex +% coordinates +% +% \begin{Syntax} +% (cs:hex column=\meta{C},row=\meta{R},vertex=\meta{V},edge=\meta{E}) +% \end{Syntax} +% +% Given the hexagon column $C$ and row $R$ with hexagon radius $r$, +% the centre of the hexagon is at +% +% \begin{eqnarray*} +% x &=& 2C\frac{3}{4}r\\ +% y &=& r(R - (C \% 2)\sin60^{\circ}) +% \end{eqnarray*} +% +% If \meta{V} or \meta{E} are given, then these are added to the +% centre point. +% +% Note, $C$ and $R$ may be fractional numbers, which will specify a +% point inside a hex. +% +% We set-up the translation to Cartesian coordinates. First +% thing is to reset keys in \spec{/hex/coords}, and then parse out the +% keys given. +% +% \begin{macrocode} +\def\hex@coords@conv#1{% + \hex@coords@reset% + \tikzset{/hex/coords/.cd, #1}% +% \end{macrocode} +% +% Then we calculate the $x$ coordinate and set the dimension +% \cs{pgf@x}. We do this by +% +% $$x=c_e \frac{3}{2}\quad,$$ +% +% where +% +% $$c_e = f_c (c+o_c)\quad,$$ +% +% is the effective column (stored in \cs{hex@eff@col}) calculated from +% is the direction factor $f_c$ (set by \spec{hex/column direction +% is}) and the offset $o_c$ (set by \spec{hex/first column is}). +% +% \begin{macrocode} + \pgfmathparse{int(\hex@coords@col@fac*(\hex@col+\hex@coords@col@off))}% + \xdef\hex@eff@col{\pgfmathresult}% + \hex@dbg{2}{Effective column: \hex@coords@col@fac * (\hex@col - + \hex@coords@col@off) -> \hex@eff@col}% + \pgfmathparse{\hex@eff@col*1.5}% + \xdef\hex@x{\pgfmathresult}% + \expandafter\pgf@x=\hex@x cm% +% \end{macrocode} +% +% And then for the $y$ coordinate and set the dimension \cs{pgf@y}. +% +% $$y = 2\left(r_e - c_e \operatorname{mod} 2\right) \cos60^{\circ}\quad,$$ +% +% where +% +% $$r_e= 2 f_r (r+o_r) - (c+o_c) \operatorname{mod} 2\quad,$$ +% +% is the effective row (stored as \cs{hex@eff@row}) calculated from +% the the direction factor $f_r$ (set by \spec{hex/row +% direction is}) and the offset $o_r$ (set by \spec{hex/first +% row is}). +% +% \begin{macrocode} + \pgfmathparse{int(\hex@coords@row@fac*(\hex@row+\hex@coords@row@off))}% + \xdef\hex@eff@row{\pgfmathresult}% + \hex@dbg{2}{Effective row: \hex@coords@row@fac * (\hex@row + + \hex@coords@row@off) -> \hex@eff@row}% + \pgfmathparse{(2*\hex@eff@row-mod(round((\hex@col+\hex@coords@col@off)),2))*\hex@yy}% + \xdef\hex@y{\pgfmathresult}% + \expandafter\pgf@x=\hex@y cm% +% \end{macrocode} +% +% If we have a vertex specification add that location to the current +% coordinates. If not, set the point. +% +% \begin{macrocode} + \ifx\hex@vtx\@empty\pgfpointxy{\hex@x}{\hex@y}\else% + \pgfpointadd{\pgfpointxy{\hex@x}{\hex@y}}{% + \pgfpointscale{\hex@off}{\pgfpointpolarxy{\hex@vtx}{1}}}\fi% +% \end{macrocode} +% +% If we have an edge specification add that location to the current +% coordinates. +% +% \begin{macrocode} + \ifx\hex@edg\@empty\else% + \pgfpointadd{\pgfpointxy{\hex@x}{\hex@y}}{% + \pgfpointscale{\hex@off}{\pgfpointpolarxy{\hex@edg}{\hex@yy}}}\fi +% \end{macrocode} +% +% For debugging, we can print out stuff. +% +% \begin{macrocode} + \hex@dbg{2}{Hex coordinates: #1 + ^^J c=\hex@col + ^^J r=\hex@row + ^^J v=\hex@vtx + ^^J e=\hex@edg + ^^J x=\hex@x + ^^J y=\hex@y}% + \global\let\hex@x\hex@x% + \global\let\hex@y\hex@y% + \global\let\hex@row\hex@row% + \global\let\hex@col\hex@col% +} +\tikzdeclarecoordinatesystem{hex}{% + \hex@coords@conv{#1}} +% \end{macrocode} +% \iffalse +%</hex> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/hex/core.dtx b/macros/latex/contrib/wargame/source/hex/core.dtx new file mode 100644 index 0000000000..1847ad42c8 --- /dev/null +++ b/macros/latex/contrib/wargame/source/hex/core.dtx @@ -0,0 +1,94 @@ +% \iffalse +% ==================================================================== +% \fi +% +% \subsection{The \texttt{wargame.hex} \TikZ{} library} +% \label{sec:impl:hex} +% +% \iffalse +%<*hex> +% \fi +% +% Used \TikZ{} libraries +% +% \begin{macrocode} +\RequirePackage{alphalph} +\usetikzlibrary{calc} +\usetikzlibrary{arrows.meta} +\usetikzlibrary{arrows} +\usetikzlibrary{shapes.geometric} +\usetikzlibrary{shapes.symbols} +\usetikzlibrary{shapes.arrows} +\usetikzlibrary{decorations} +\usetikzlibrary{decorations.pathmorphing} +\usetikzlibrary{decorations.pathreplacing} +\usetikzlibrary{decorations.markings} +\usetikzlibrary{wargame.util} +% \end{macrocode} +% +% +% \begin{Macro}{\@ifempty} +% +% This is a utility macro we will use below. +% +% \begin{macrocode} +\def\@ifempty#1{\def\temp{#1}\ifx\temp\@empty} +% \end{macrocode} +% \end{Macro} +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% +% \subsubsection{Debugging} +% +% The counter \cs{hexdbglvl} sets the debug level, and the macro +% \cs{hex@dbg} prints out (conditionally) debug messages. +% +% \begin{Macro}{\hexdbglvl,\hex@dbg} +% \begin{macrocode} +\newcount\hexdbglvl\hexdbglvl=\wargamedbglvl +\def\hex@dbg#1#2{% + \ifnum#1>\hexdbglvl\relax\else\message{^^J#2}\fi} +% \end{macrocode} +% \end{Macro} +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% \subsubsection{Suppress terrain pictures} +% +% \begin{macrocode} +\@ifundefined{ifhex@terrain@pic}{% + \newif\ifhex@terrain@pic + \hex@terrain@pictrue}{} +% \end{macrocode} +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% +% \input{hex/coord.dtx} +% \input{hex/shape.dtx} +% \input{hex/terrain.dtx} +% \input{hex/terrain/beach.dtx} +% \input{hex/terrain/light_woods.dtx} +% \input{hex/terrain/woods.dtx} +% \input{hex/terrain/swamp.dtx} +% \input{hex/terrain/rough.dtx} +% \input{hex/terrain/mountains.dtx} +% \input{hex/terrain/village.dtx} +% \input{hex/terrain/town.dtx} +% \input{hex/terrain/city.dtx} +% \input{hex/terrain/mountain.dtx} +% \input{hex/terrain/tree.dtx} +% \input{hex/ridges.dtx} +% \input{hex/towns.dtx} +% \input{hex/labels.dtx} +% \input{hex/extra.dtx} +% \input{hex/paths.dtx} +% \input{hex/board.dtx} +% \iffalse +%</hex> +% \fi +%
\ No newline at end of file diff --git a/macros/latex/contrib/wargame/source/hex/extra.dtx b/macros/latex/contrib/wargame/source/hex/extra.dtx new file mode 100644 index 0000000000..05f7215297 --- /dev/null +++ b/macros/latex/contrib/wargame/source/hex/extra.dtx @@ -0,0 +1,83 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*hex> +% \fi +% +% \subsubsection{Extra graphics} +% \label{sec:impl:hex:extra} +% +% To make the interface a bit more flexible we allow for adding +% arbitrary stuff to the hexes. +% +% Some examples of \spec{pic}tures to add in the \spec{extra} stuff. +% +% \begin{HexKey}{hex/fortress} +% +% Draw a fortress. An example of a extra graphics entity. +% +% \begin{macrocode} +\tikzset{% + hex/fortress/.pic={ + \path[draw,pic actions] + (0: .9) -- + (0: .7) -- + (60: .7) -- ( 60:.9) -- ( 60:.7) -- + (120:.7) -- (120:.9) -- (120:.7) -- + (180:.7) -- (180:.9) -- (180:.7) -- + (240:.7) -- (240:.9) -- (240:.7) -- + (300:.7) -- (300:.9) -- (300:.7) -- + (0: .7) -- cycle;}} +% \end{macrocode} +% \end{HexKey} +% +% \begin{HexKey}{hex/fortress 2} +% +% Draw a fortress. An example of a extra graphics entity. +% +% \begin{macrocode} +\tikzset{ + hex/fortress 2/.pic={% + \draw[pic actions,transform shape] (0:0.64) + foreach \a in {15,45,...,345}{ + --(\a:0.64) + --(\a:0.80) + --(\a+15:0.80) + --(\a+15:0.64)} + --cycle; + }, +} +% \end{macrocode} +% \end{HexKey} +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% +% \subsubsection{Some macros} +% +% +% \begin{macrocode} +\DeclareRobustCommand\fortmark[1][scale=.25]{\tikz[#1,transform shape]{% + \pic{hex/fortress 2}}} +\providecommand\terrainmark[2][scale=.2]{% + \tikz[#1]{\hex[label=,terrain=#2]}} +\providecommand\clearhex[1][scale=.2]{\tikz[#1]{\hex[label=]}} +\providecommand\woodshex[1][scale=.2]{\terrainmark[#1]{woods}} +\providecommand\mountainhex[1][scale=.2]{\terrainmark[#1]{mountains}} +\providecommand\cityhex[1][scale=.2]{\terrainmark[#1]{city}} +\providecommand\beachhex[1][scale=.2]{\terrainmark[#1]{beach}} +\providecommand\seahex[1][scale=.2]{\tikz[#1]{\hex[label=,fill=sea]}} +\providecommand\riverhex[1][scale=.2]{% + \tikz[#1]{% + \hex[label=](c=0,r=0)% + \river[](hex cs:e=SW)--(hex cs:e=NE);}} +\providecommand\roadhex[1][scale=.2]{% + \tikz[#1]{% + \hex[label=](c=0,r=0)% + \road(hex cs:e=SW)--(hex cs:e=NE);}} +% \end{macrocode} +% +% \iffalse +%</hex> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/hex/labels.dtx b/macros/latex/contrib/wargame/source/hex/labels.dtx new file mode 100644 index 0000000000..7767dcc661 --- /dev/null +++ b/macros/latex/contrib/wargame/source/hex/labels.dtx @@ -0,0 +1,160 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*hex> +% \fi +% +% \subsubsection{Labels} +% \label{sec:impl:hex:label} +% +% Like terrains, we will set up some macros for dealing with labels. +% +% To process coordinates and turn them into labels, we set up two +% counters. +% +% \begin{macrocode} +\newcounter{hex@l@c} +\newcounter{hex@l@r} +% \end{macrocode} +% +% In case we want to invert the row axis, we set-up a key to set the +% maximum row number. +% +% \begin{macrocode} +\def\hex@max@row{-1} +\tikzset{ + max hex row/.store in=\hex@max@row, +} +% \end{macrocode} +% +% Again, we will make a separate namespace/family for the handling +% labels. We also define a counter which we will use to typeset +% alphabetic column numbers. +% +% First a graphics style. +% +% \begin{macrocode} +\tikzset{% + hex/label/.style={% + draw=none,% + shape=rectangle,% + anchor=north,% + color=gray,% + font=\sffamily\bfseries\scriptsize,% + inner sep=0}, +} +% \end{macrocode} +% +% Next, the choices of how to make a label. These are put in the +% \spec{/hex/label} family to make it easy to parse out only these +% keys. This uses some macros defined below. Note, this uses the +% macros \cs{hex@col} and \cs{hex@row} defined by the hex coordinate +% system. +% +% \begin{macrocode} +\tikzset{% + /hex/label/.search also={/tikz}, + /hex/label/.cd, + none/.code={\global\let\hex@l@text\@empty}, + auto/.is choice, + auto/none/.code={\global\let\hex@l@text\@empty}, + auto/numbers/.code={% + \hex@l@abs% + \xdef\hex@l@text{% + \hex@l@n@pad{\the\c@hex@l@c}% + \hex@l@n@pad{\the\c@hex@l@r}}}, + auto/alpha column/.code={% + \xdef\hex@l@text{% + \ifnum0>\hex@col\AlphAlph{-\hex@col}\else\AlphAlph{\hex@col}\fi% + \hex@row}}, + auto/alpha 2 column/.code={% + \hex@l@abs% + \advance\c@hex@l@c27\relax% + \xdef\hex@l@text{% + \AlphAlph{\value{hex@l@c}}% + \hex@l@n@pad{\hex@row}}}, + auto/inv y x plus 1/.code={% + \hex@dbg{3}{Inverse row, add one to column with arg `#1'} + \let\hex@l@text\@empty% + \ifnum\hex@max@row>0% + \pgfmathtruncatemacro{\hex@l@row}{\hex@max@row-\hex@row} + \pgfmathtruncatemacro{\hex@l@col}{1+\hex@col} + \xdef\hex@l@text{% + \hex@l@n@pad{\hex@l@col}% + \hex@l@n@pad{\hex@l@row}} + \else\message{Max row number not set}\fi}, + auto/x and y plus 1/.code={% + \hex@dbg{3}{Inverse row, add one to column with arg `#1'} + \pgfmathtruncatemacro{\hex@l@row}{1+\hex@row} + \pgfmathtruncatemacro{\hex@l@col}{1+\hex@col} + \xdef\hex@l@text{% + \hex@l@n@pad{\hex@l@col}% + \hex@l@n@pad{\hex@l@row}}}, + auto/.default=numbers, + %text/.store in=\hex@l@text, + text/.code={\gdef\hex@l@text{#1}}, + place/.store in=\hex@l@pos, + location/.forward to=/hex/label/place, + rotate/.store in=\hex@l@rot +} +% \end{macrocode} +% \begin{Macro}{\hex@l@abs} +% +% This takes the absolute value of row and column numbers. +% +% \begin{macrocode} +\def\hex@l@abs{ + \setcounter{hex@l@c}{\hex@col} + \setcounter{hex@l@r}{\hex@row} + \expandafter\ifnum\value{hex@l@c}<0\multiply\c@hex@l@c by-1\fi% + \expandafter\ifnum\value{hex@l@r}<0\multiply\c@hex@l@r by-1\fi% + % \hex@dbg{0}{\hex@col->\the\c@hex@l@c\space\hex@row->\the\c@hex@l@r} +} +% \end{macrocode} +% \end{Macro} +% +% \begin{Macro}{\hex@l@n@pad} +% This will pad a number with a 0 if the number is smaller than 10. +% +% \begin{macrocode} +\long\def\hex@l@n@pad#1{% + \ifnum#1<10 0\fi% + #1} +% \end{macrocode} +% \end{Macro} +% +% +% \begin{Macro}{\hex@do@label} +% +% This macro puts in the label. First, we reset label keys, then we +% read in the keys from the argument. If this results in the macro +% \cs{hex@l@text} to be non-empty, then we set the label via a +% \TikZ{} \spec{node}. +% +% \begin{macrocode} +\def\hex@do@label{% + \hex@dbg{1}{Hex label: `\meaning\hex@label'}% + \edef\hex@l@tmp{[% + /hex/label/.cd,% + rotate=0,% + place={(90:.8)},% + /tikz/hex/label/.try,% + /tikz/every hex label/.try,% + \hex@label]}% + \expandafter\scope\hex@l@tmp% + \hex@dbg{1}{Label: + ^^J Text: `\meaning\hex@l@text' + ^^J Location: `\meaning\hex@l@pos' + ^^J Rotation: `\meaning\hex@l@rot' + }% + \@ifundefined{hex@l@text}{\let\hex@l@text\empty}{}% + \ifx\hex@l@text\empty\else% + \node[rotate=\hex@l@rot] at \hex@l@pos {\hex@l@text};% + \fi% + \endscope% +} +% \end{macrocode} +% \end{Macro} +% \iffalse +%</hex> +% -------------------------------------------------------------------- +% \fi 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 diff --git a/macros/latex/contrib/wargame/source/hex/ridges.dtx b/macros/latex/contrib/wargame/source/hex/ridges.dtx new file mode 100644 index 0000000000..3914ff6ce5 --- /dev/null +++ b/macros/latex/contrib/wargame/source/hex/ridges.dtx @@ -0,0 +1,139 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*hex> +% \fi +% +% \subsubsection{Ridges} +% \label{sec:impl:hex:ridges} +% +% A hex can be decorated with up to 6 ridges --- one for each edge of +% the hexagon. The first thing is to set up the graphics style to use +% for the ridges. We use the \spec{wave} decoration. +% +% \begin{macrocode} +\tikzset{% + hex/ridges/.style={ + line cap=round, + draw=pgfstrokecolor, + rounded corners=.25cm, + scale line widths, + decoration={ + path has corners=true, + pre=waves, + post=waves, + pre length=-.1cm, + post length=0cm, + waves, + radius=.2cm, + segment length=.2cm}, + decorate}} +% \end{macrocode} +% +% To properly set up the ridges, we need to concatenate ridge paths in +% order. To facilitate that, we define 6 \cs{if}s --- one for each +% edge. +% +% \begin{macrocode} +\newif\ifhex@r@ne +\newif\ifhex@r@n +\newif\ifhex@r@nw +\newif\ifhex@r@sw +\newif\ifhex@r@s +\newif\ifhex@r@se +% \end{macrocode} +% +% Next is the keys for each edge. These will set the above \cs{if}s +% to \spec{true}. We put these into the family \spec{/hex/r} so that +% we can parse them separately. +% +% \begin{macrocode} +\tikzset{% + /hex/ridges/.search also={/tikz}, + /hex/ridges/.cd, + north east/.is if=hex@r@ne, + north/.is if=hex@r@n, + north west/.is if=hex@r@nw, + south west/.is if=hex@r@sw, + south/.is if=hex@r@s, + south east/.is if=hex@r@se, + radius/.store in=\hex@r@r, + NE/.is if=hex@r@ne, + N/.is if=hex@r@n, + NW/.is if=hex@r@nw, + SW/.is if=hex@r@sw, + S/.is if=hex@r@s, + SE/.is if=hex@r@se, + r/.store in=\hex@r@r, +} +% \end{macrocode} +% +% \begin{Macro}{\hex@do@ridges} +% +% This is the macro that actually generates the ridge. We use the +% same \textsc{pgf} filtered key parsing trick as above. Note that +% the routine below is handcrafted since it is relatively simple. +% +% \begin{macrocode} +\def\hex@do@ridges{% + \edef\hex@r@tmp{[ + /hex/ridges/.cd,% + radius=0.8,% + /tikz/every hex ridges/.try, + \hex@ridges]} + \expandafter\scope\hex@r@tmp% + \hex@dbg{3}{Ridges: `\meaning\hex@ridges', `\meaning\hex@r@tmp' + ^^Jnorth east=\ifhex@r@ne yes\else no\fi + ^^Jnorth =\ifhex@r@n yes\else no\fi + ^^Jnorth west=\ifhex@r@nw yes\else no\fi + ^^Jsouth west=\ifhex@r@sw yes\else no\fi + ^^Jsouth =\ifhex@r@s yes\else no\fi + ^^Jsouth east=\ifhex@r@se yes\else no\fi + ^^Jradius =\hex@r@r + } + \def\hex@r@p{} + % Hand written algorithm + \ifhex@r@ne + \def\hex@r@p{(0:\hex@r@r)--(60:\hex@r@r)} + \fi + \ifhex@r@n + \hex@dbg{4}{Ridge along north edge: `\hex@r@p'} + \ifhex@r@ne\else + \xdef\hex@r@p{\hex@r@p ( 60:\hex@r@r)} + \fi + \xdef\hex@r@p{\hex@r@p --(120:\hex@r@r)} + \fi + \ifhex@r@nw + \ifhex@r@n\else + \xdef\hex@r@p{\hex@r@p (120:\hex@r@r)} + \fi + \xdef\hex@r@p{\hex@r@p --(180:\hex@r@r)} + \fi + \ifhex@r@sw + \ifhex@r@nw\else + \xdef\hex@r@p{\hex@r@p (180:\hex@r@r)} + \fi + \xdef\hex@r@p{\hex@r@p --(240:\hex@r@r)} + \fi + \ifhex@r@s + \ifhex@r@sw\else + \xdef\hex@r@p{\hex@r@p (240:\hex@r@r)} + \fi + \xdef\hex@r@p{\hex@r@p --(300:\hex@r@r)} + \fi + \ifhex@r@se + \ifhex@r@s\else + \xdef\hex@r@p{\hex@r@p (300:\hex@r@r)} + \fi + \xdef\hex@r@p{\hex@r@p --(360:\hex@r@r)} + \fi + \hex@dbg{3}{ Ridges path: \hex@r@p} + \draw[hex/ridges] \hex@r@p; + \endscope% End of ridges scope +} +% \end{macrocode} +% \end{Macro} +% +% \iffalse +%</hex> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/hex/shape.dtx b/macros/latex/contrib/wargame/source/hex/shape.dtx new file mode 100644 index 0000000000..0d31da837f --- /dev/null +++ b/macros/latex/contrib/wargame/source/hex/shape.dtx @@ -0,0 +1,368 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*hex> +% \fi +% +% \subsubsection{Hexes} +% \label{sec:impl:hex:hex} +% +% In this part, we make macros etc. for the hexes. +% +% A hex shape. We make a node of this shape if we are to give a name +% to the hex added. We add a bunch of anchors to it so we may easily +% refer to it. This is also where we actual fill stuff into the hex, +% such as terrain and so on. +% +% \begin{macrocode} +\hex@dbg{5}{Base vertex: \hex@xx,\hex@yy} +\hex@dbg{5}{Base edges: \hex@e@xx,\hex@e@yy} +\pgfdeclareshape{hex/hex}{% + \saveddimen\radius{\pgf@x=\hex@radius} + \savedanchor{\east}{ \pgfqpoint{ \hex@radius}{0cm}} + \savedanchor{\west}{ \pgfqpoint{-\hex@radius}{0cm}} + \savedanchor{\northeast}{ \pgfqpoint{ \hex@dx}{ \hex@dy}} + \savedanchor{\northwest}{ \pgfqpoint{-\hex@dx}{ \hex@dy}} + \savedanchor{\southwest}{ \pgfqpoint{-\hex@dx}{-\hex@dy}} + \savedanchor{\southeast}{ \pgfqpoint{ \hex@dx}{-\hex@dy}} + \savedanchor{\northedge}{ \pgfqpoint{ 0cm}{ \hex@dy}} + \savedanchor{\southedge}{ \pgfqpoint{ 0cm}{-\hex@dy}} + \savedanchor{\northeastedge}{\pgfqpoint{ \hex@e@dx}{ \hex@e@dy}} + \savedanchor{\northwestedge}{\pgfqpoint{-\hex@e@dx}{ \hex@e@dy}} + \savedanchor{\southwestedge}{\pgfqpoint{-\hex@e@dx}{-\hex@e@dy}} + \savedanchor{\southeastedge}{\pgfqpoint{ \hex@e@dx}{-\hex@e@dy}} + \savedmacro\init{% + \def\hexpath{% + \pgfpathmoveto{\east}% + \pgfpathlineto{\northeast}% + \pgfpathlineto{\northwest}% + \pgfpathlineto{\west}% + \pgfpathlineto{\southwest}% + \pgfpathlineto{\southeast}% + \pgfpathclose} + } +% \end{macrocode} +% +% These are the actual user callable anchors. We make anchors for +% each vertex and mid points on each edge. +% +% \begin{macrocode} +%% + \anchor{center}{ \pgfpointorigin} + \anchor{east}{ \east} + \anchor{west}{ \west} + \anchor{north east}{ \northeast} + \anchor{north west}{ \northwest} + \anchor{south west}{ \southwest} + \anchor{south east}{ \southeast} + \anchor{north edge}{ \northedge} + \anchor{south edge}{ \southedge} + \anchor{north east edge}{\northeastedge} + \anchor{north west edge}{\northwestedge} + \anchor{south west edge}{\southwestedge} + \anchor{south east edge}{\southeastedge} +% \end{macrocode} +% +% Next we make some short hand aliases for each of these anchors. +% +% \begin{macrocode} + \anchor{E}{ \east} + \anchor{W}{ \west} + \anchor{NE}{ \northeast} + \anchor{NW}{ \northwest} + \anchor{SW}{ \southwest} + \anchor{SE}{ \southeast} + \anchor{N edge}{ \northedge} + \anchor{S edge}{ \southedge} + \anchor{NE edge}{\northeastedge} + \anchor{NW edge}{\northwestedge} + \anchor{SW edge}{\southwestedge} + \anchor{SE edge}{\southeastedge} +% \end{macrocode} +% +% The next part is commented out because its not obvious we'll use +% these. +% +% \begin{macrocode} + %% + \savedanchor{\chitnorth}{ \pgfqpoint{ 0cm}{ 0.6cm}} + \savedanchor{\chitsouth}{ \pgfqpoint{ 0cm}{ -0.6cm}} + \savedanchor{\chiteast}{ \pgfqpoint{ 0.6cm}{ 0cm}} + \savedanchor{\chitwest}{ \pgfqpoint{-0.6cm}{ 0cm}} + \savedanchor{\chitnortheast}{\pgfqpoint{ 0.6cm}{ 0.6cm}} + \savedanchor{\chitnorthwest}{\pgfqpoint{-0.6cm}{ 0.6cm}} + \savedanchor{\chitsouthwest}{\pgfqpoint{-0.6cm}{-0.6cm}} + \savedanchor{\chitsoutheast}{\pgfqpoint{ 0.6cm}{-0.6cm}} + % + \anchor{chit north}{\chitnorth} + \anchor{chit south}{\chitsouth} + \anchor{chit east}{\chiteast} + \anchor{chit west}{\chitwest} + \anchor{chit north east}{\chitnortheast} + \anchor{chit north west}{\chitnorthwest} + \anchor{chit south west}{\chitsouthwest} + \anchor{chit south east}{\chitsoutheast} + % + \anchor{chit N}{\chitnorth} + \anchor{chit S}{\chitsouth} + \anchor{chit E}{\chiteast} + \anchor{chit W}{\chitwest} + \anchor{chit NE}{\chitnortheast} + \anchor{chit NW}{\chitnorthwest} + \anchor{chit SW}{\chitsouthwest} + \anchor{chit SE}{\chitsoutheast} + % +% \end{macrocode} +% +% The background path. This path may be drawn when the node is +% drawn. However, we will do most of the work in the +% \cs{behindbackgroundpath} which gets drawn \emph{after} this path. +% +% \begin{macrocode} + \backgroundpath{\init\hexpath} +% \end{macrocode} +% +% The \emph{behind} background path, where we do most of the work. +% +% \begin{macrocode} + \behindforegroundpath{% + \hex@dbg{2}{Hex behind foreground path: + ^^JTerrain: `\meaning\hex@terrain' + ^^JRidges: `\meaning\hex@ridges' + ^^JTown: `\meaning\hex@town' + ^^JExtra clipped: `\meaning\hex@extra@clip' + ^^JLabel: `\meaning\hex@label' + ^^JExtra: `\meaning\hex@extra' + ^^JLast node name:`\meaning\tikzlastnode' + ^^JHex row: `\meaning\hex@row' + ^^JHex col: `\meaning\hex@col' + }% + \init% +% \end{macrocode} +% +% We start a scope and clip to the hex path first. +% +% \begin{macrocode} + \scope% + \hexpath% + \pgfusepath{clip}% +% \end{macrocode} +% +% Anything inside this scope is clipped to the hex path. The next +% step is to see if we have a specified terrain for the hex. +% +% \begin{macrocode} + \@ifundefined{hex@terrain}{\let\hex@terrain\empty}{}% + \ifx\hex@terrain\empty\else\hex@do@terrain\fi% +% \end{macrocode} +% +% This concludes the processing of the terrain of the hex. Next, we +% must see if the user specified ridges. +% +% \begin{macrocode} + \@ifundefined{hex@ridges}{\let\hex@ridges\empty}{}% + \ifx\hex@ridges\empty\else\hex@do@ridges\fi% +% \end{macrocode} +% +% This concludes the processing of the ridges of the hex. Next, we +% should process any extra (clipped) stuff specified. The user may +% pass options to each \spec{pic}ture by preceding it with +% \oarg{options}. +% +% \begin{macrocode} + \@ifundefined{hex@extra@clip}{\let\hex@extra@clip\empty}{} + \ifx\hex@extra@clip\empty\else% + \hex@dbg{5}{Extra clipped: `\meaning\hex@extra'} + \pgfpointorigin\wg@tmpa=\pgf@x\wg@tmpb=\pgf@y% + \wg@pic@all{\hex@extra@clip}{}{\the\wg@tmpa,\the\wg@tmpb}{}% + \fi% +% \end{macrocode} +% +% This concludes the extra stuff put in the hex. Next, we should +% place the label is specified. Note, we may know the hex row and +% column at this point, stored in \cs{hex@row} and \cs{hex@column}, +% respectively. We may want to name the generated node from these if +% the user specified that option (perhaps use \cs{pgfnoderename} or +% similar). +% +% \begin{macrocode} + \@ifundefined{hex@label}{\let\hex@label\empty}{} + \ifx\hex@label\empty\else\hex@do@label\fi% + \endscope% +% \end{macrocode} +% +% This concludes the label processing, and stuff that should be +% clipped to the hex shape. If the user specified a town, we can now +% make that. +% +% \begin{macrocode} + \@ifundefined{hex@town}{\let\hex@town\empty}{} + \@ifundefined{hex@c@pic}{\let\hex@c@pic\empty}{} + \ifx\hex@town\empty\else\hex@do@town\fi% +% \end{macrocode} +% +% We can now add extra (non-clipped) stuff. We assume that extra +% stuff is \spec{pic}tures. The user may pass options to each +% \spec{pic}ture by preceding it with \oarg{options}. +% +% \begin{macrocode} + \@ifundefined{hex@extra}{\let\hex@extra\empty}{} + \ifx\hex@extra\empty\else% + \hex@dbg{5}{Extra: `\meaning\hex@extra'} + \pgfpointorigin\wg@tmpa=\pgf@x\wg@tmpb=\pgf@y% + \wg@pic@all{\hex@extra}{}{\the\wg@tmpa,\the\wg@tmpb}{}% + \fi% + } +} +% \end{macrocode} +% +% \begin{HexKey*}{ +% /hex/terrain, +% /hex/town, +% /hex/label, +% /hex/ridges, +% /hex/extra, +% /hex/extra clipped} +% +% Next, we set up the name space for hex keys. This is the top level +% name space for hexes. Sub keys \spec{terrain}, \spec{ridges}, +% \spec{town}, \spec{extra}, \spec{label}, and \spec{extra clipped}, +% store their arguments in macros and we expand these later on. This +% allows us to scope some of the keys given to those specific parts. +% +% Define keys for hexagon options. These are +% +% \begin{tabular}{|l|p{.7\linewidth}|} +% \hline +% \rowcolor{headbg} +% {\color{headfg}\textbf{Name}} +% & {\color{headfg}\textbf{Description}}\\ +% \hline +% \spec{terrain} & Terrain\\ +% \spec{label} & Label on hex\\ +% \spec{town} & Town in hex. Optionally with a name\\ +% \spec{ridges} & Ridge markings on hex\\ +% \spec{extra} & More \\ +% \spec{extra clipped} & More clipped to hex\\ +% \hline +% \end{tabular} +% +% \begin{macrocode} +\tikzset{% + /hex/.search also={/tikz},% + /hex/.cd,% + terrain/.store in=\hex@terrain,% + ridges/.store in=\hex@ridges,% + town/.store in=\hex@town,% + extra/.store in=\hex@extra,% + label/.store in=\hex@label,% + extra clipped/.store in=\hex@extra@clip% +} +% \end{macrocode} +% \end{HexKey*} +% +% \begin{TikzKey}{hex} +% The next key is the real work horse of the show. Specifying the +% \spec{hex} key to a node effectively creates a hex for us. Now, +% there are some things we cannot do outright in the node shape +% code. For example, we cannot set the name of the node created +% from the shape code. Therefore, the use of \cs{hex} is often the +% right choice. +% +% \begin{macrocode} +\tikzset{% + hex/hex/.style={ + transform shape, + anchor=center, + draw=pgfstrokecolor, + fill=none, + thick, + solid}, + hex/.code={% + \hex@dbg{1}{=== Hex with options: `#1'}% + \pgfkeys{/tikz/transform shape,/tikz/shape=hex/hex} + \pgfkeys{/hex/.cd,/tikz/hex/hex,/tikz/every hex/.try,#1}}} +% \end{macrocode} +% \end{TikzKey} +% +% The first thing is to set the default graphics options. The key +% \spec{every hex} can be set to hex options to be used for all hexes. +% For example, if one want to label all hexes with an auto-generated +% label, one can do +% +% \begin{Syntax} +% \cs{tikzset}\{every hex/.style=\{label=\{auto=numbered\}\}\} +% \end{Syntax} +% +% This, coupled with the \spec{hex/label is name} option allows us to +% set up the board with really minimal effort. We can then use the +% board coordinates when placing units, and other things. +% +% +% Now we have set up these tools we can go on and define the user +% facing macro. +% +% \begin{Macro}{\hex,\hex@,\hex@@} +% +% This will add a hex to the output graphics. Note, the macro +% need not be followed by a semi-colon (\spec{;}). +% +% First argument is optional options. +% +% \begin{macrocode} +\def\hex{% + \@ifnextchar[{\hex@}{\hex@[]}%] +} +% \end{macrocode} +% +% Second optional argument is the coordinates. These should be given +% in the hex coordinate system. +% +% \begin{macrocode} +\def\hex@[#1]{% + \@ifnextchar({\hex@@{#1}}{% + \hex@@{#1}(c=0,r=0)}%) +} +% \end{macrocode} +% +% Third argument is the name to be used. +% +% \begin{macrocode} +\def\hex@@#1(#2){% + \@ifnextchar({\hex@@@{#1}{#2}}{\hex@@@{#1}{#2}()}%) +} +% \end{macrocode} +% +% Now for the real work-horse. First thing is to reset keys and parse +% them out from the arguments. +% +% \begin{macrocode} +% Third argument is name +\def\hex@@@#1#2(#3){% + \node[hex={#1}] (tmp) at (hex cs:#2) {};% + \hex@dbg{8}{=== Label text: `\meaning\hex@l@text'} + \ifx|#3|\relax% + \@ifundefined{hex@l@text}{% + \hex@dbg{8}{=== Label text of hex (#2) not defined}% + \let\hex@l@text\empty% + }{} + \ifhex@label@is@name% + \hex@dbg{5}{=== Use label text of hex (#2) as name}% + \ifx\hex@l@text\@empty% + \hex@dbg{8}{=== Argh! Label text is empty! `\meaning\hex@l@text'} + \else% + \hex@dbg{3}{=== Renaming hex to label text `\hex@l@text'} + \pgfnoderename{\hex@l@text}{tmp}% + \fi% + \fi% + \else% + \hex@dbg{3}{=== Renaming hex to user defined name `#3'}% + \pgfnoderename{#3}{tmp}% + \fi% + \@ifnextchar;{\@gobble}{}% +} +% \end{macrocode} +% \end{Macro} +% \iffalse +%</hex> +% -------------------------------------------------------------------- +% \fi 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 diff --git a/macros/latex/contrib/wargame/source/hex/terrain/beach.dtx b/macros/latex/contrib/wargame/source/hex/terrain/beach.dtx new file mode 100644 index 0000000000..98e990c15c --- /dev/null +++ b/macros/latex/contrib/wargame/source/hex/terrain/beach.dtx @@ -0,0 +1,698 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*hex> +% \fi +% Next, we define some styles for styling the terrain pictures. Users +% can change these styles (e.g., by appending to them) to change say +% the colour of the terrain graphics. +% +% +% \begin{TikzKey}{hex/terrain/beach} +% The style for beach hexes. The pattern is filled with a yellowish +% colour, and drawing of the outline is disabled. +% +% \begin{macrocode} +\tikzset{ + hex/terrain/beach/.style={% + fill={rgb,100:red,93;green,73;blue,35},% + draw=none% + }% +} +% \end{macrocode} +% \end{TikzKey} +% +% Now for the actual patterns. We go in the same order as above --- +% i.e, we start with the beach pattern. This is rather long. +% +% \begin{TikzKey}{hex/terrain/beach} +% \begin{macrocode} +\ifhex@terrain@pic +\tikzset{ + hex/terrain/beach/.pic={ + \path[hex/terrain/beach,pic actions,draw=none] + (-0.4931, 0.8848) + -- (-0.4998, 0.8734) + .. controls (-0.4908, 0.8731) and (-0.4813, 0.8762) .. (-0.4762, 0.8847) + --cycle + (-0.4032, 0.8841) + .. controls (-0.4004, 0.8804) and (-0.3988, 0.8794) .. (-0.3956, 0.8745) + .. controls (-0.3760, 0.8443) and (-0.3811, 0.8330) .. (-0.3456, 0.8112) + .. controls (-0.3250, 0.7986) and (-0.2712, 0.7770) .. (-0.2531, 0.8032) + .. controls (-0.2294, 0.8375) and (-0.2984, 0.8503) .. (-0.3193, 0.8690) + .. controls (-0.3243, 0.8735) and (-0.3281, 0.8785) .. (-0.3321, 0.8835) + --cycle + (-0.2462, 0.8828) + .. controls (-0.2425, 0.8681) and (-0.2383, 0.8546) .. (-0.2293, 0.8461) + .. controls (-0.2102, 0.8280) and (-0.1892, 0.8390) .. (-0.1859, 0.8669) + .. controls (-0.1854, 0.8711) and (-0.1871, 0.8772) .. (-0.1875, 0.8822) + --cycle + (-0.0997, 0.8815) + .. controls (-0.0971, 0.8706) and (-0.0941, 0.8597) .. (-0.0907, 0.8493) + -- (-0.0570, 0.8578) + .. controls (-0.0570, 0.8629) and (-0.0560, 0.8730) .. (-0.0553, 0.8812) + --cycle + ( 0.0213, 0.8805) + .. controls ( 0.0222, 0.8725) and ( 0.0235, 0.8650) .. ( 0.0262, 0.8587) + .. controls ( 0.0391, 0.8281) and ( 0.0706, 0.8199) .. ( 0.0917, 0.7894) + .. controls ( 0.1112, 0.7609) and ( 0.1058, 0.7286) .. ( 0.1050, 0.6961) + -- ( 0.1731, 0.7216) + -- ( 0.1203, 0.8649) + -- ( 0.1097, 0.8797) + --cycle + ( 0.2978, 0.8781) + .. controls ( 0.2985, 0.8773) and ( 0.3002, 0.8756) .. ( 0.3008, 0.8749) + .. controls ( 0.2854, 0.8687) and ( 0.2549, 0.8572) .. ( 0.2421, 0.8487) + .. controls ( 0.2026, 0.8224) and ( 0.1905, 0.7567) .. ( 0.2046, 0.7132) + .. controls ( 0.2146, 0.6819) and ( 0.2330, 0.6680) .. ( 0.2394, 0.6280) + .. controls ( 0.2413, 0.6160) and ( 0.2468, 0.5527) .. ( 0.2446, 0.5437) + .. controls ( 0.2396, 0.5232) and ( 0.2211, 0.5122) .. ( 0.2231, 0.4913) + .. controls ( 0.2261, 0.4603) and ( 0.2686, 0.4388) .. ( 0.2891, 0.4194) + .. controls ( 0.3020, 0.4071) and ( 0.3136, 0.3895) .. ( 0.3281, 0.3799) + .. controls ( 0.3688, 0.3533) and ( 0.3905, 0.3863) .. ( 0.4199, 0.3902) + .. controls ( 0.4350, 0.3921) and ( 0.4560, 0.3849) .. ( 0.4710, 0.3812) + -- ( 0.4795, 0.4067) + -- ( 0.4965, 0.4067) + .. controls ( 0.5008, 0.3961) and ( 0.5009, 0.3893) .. ( 0.5112, 0.3811) + .. controls ( 0.5112, 0.3811) and ( 0.6172, 0.3385) .. ( 0.6481, 0.3037) + .. controls ( 0.6729, 0.2758) and ( 0.6641, 0.2532) .. ( 0.6667, 0.2206) + -- ( 0.7004, 0.2206) + .. controls ( 0.7839, 0.2118) and ( 0.7047, 0.0740) .. ( 0.7057, 0.0568) + .. controls ( 0.7067, 0.0396) and ( 0.7865,-0.0424) .. ( 0.8032,-0.0520) + .. controls ( 0.8251,-0.0644) and ( 0.8703,-0.0686) .. ( 0.8572,-0.0293) + .. controls ( 0.8518,-0.0131) and ( 0.7996, 0.0474) .. ( 0.7843, 0.0564) + .. controls ( 0.7724, 0.0633) and ( 0.7645, 0.0636) .. ( 0.7518, 0.0664) + .. controls ( 0.7688, 0.1093) and ( 0.7993, 0.1905) .. ( 0.7930, 0.2362) + .. controls ( 0.7869, 0.2804) and ( 0.7252, 0.2982) .. ( 0.6946, 0.3268) + .. controls ( 0.6664, 0.3531) and ( 0.6746, 0.3662) .. ( 0.6323, 0.3966) + .. controls ( 0.5760, 0.4371) and ( 0.5386, 0.4324) .. ( 0.5250, 0.4601) + .. controls ( 0.5090, 0.4927) and ( 0.5578, 0.6035) .. ( 0.5969, 0.5911) + .. controls ( 0.6199, 0.5839) and ( 0.6224, 0.5471) .. ( 0.6341, 0.5291) + .. controls ( 0.6488, 0.5064) and ( 0.7020, 0.4614) .. ( 0.7263, 0.4493) + -- ( 0.7373, 0.4768) + -- ( 0.6866, 0.5671) + -- ( 0.6756, 0.5720) + -- ( 0.6766, 0.5850) + -- ( 0.6331, 0.6627) + .. controls ( 0.6280, 0.6613) and ( 0.6239, 0.6599) .. ( 0.6157, 0.6589) + -- ( 0.5646, 0.6589) + .. controls ( 0.5375, 0.6557) and ( 0.5277, 0.6432) .. ( 0.4965, 0.6489) + .. controls ( 0.4716, 0.6520) and ( 0.4306, 0.6774) .. ( 0.4104, 0.6489) + .. controls ( 0.3809, 0.6093) and ( 0.4627, 0.6240) .. ( 0.4837, 0.5772) + .. controls ( 0.4958, 0.5502) and ( 0.4652, 0.4811) .. ( 0.4429, 0.4648) + -- ( 0.3523, 0.4350) + .. controls ( 0.3178, 0.4372) and ( 0.3207, 0.4766) .. ( 0.3153, 0.5004) + .. controls ( 0.3090, 0.5282) and ( 0.2968, 0.5398) .. ( 0.2922, 0.5684) + .. controls ( 0.2896, 0.6035) and ( 0.3061, 0.6276) .. ( 0.2922, 0.6621) + .. controls ( 0.2756, 0.6961) and ( 0.2422, 0.7190) .. ( 0.2525, 0.7640) + .. controls ( 0.2650, 0.8188) and ( 0.3165, 0.7932) .. ( 0.3324, 0.8417) + .. controls ( 0.3359, 0.8522) and ( 0.3385, 0.8648) .. ( 0.3399, 0.8778) + --cycle + ( 0.4261, 0.8770) + -- ( 0.4333, 0.8493) + -- ( 0.4845, 0.7440) + .. controls ( 0.4963, 0.7304) and ( 0.5450, 0.6930) .. ( 0.5630, 0.6989) + .. controls ( 0.5735, 0.7024) and ( 0.5838, 0.7169) .. ( 0.5932, 0.7337) + -- ( 0.5612, 0.7909) + .. controls ( 0.5537, 0.7875) and ( 0.5468, 0.7852) .. ( 0.5403, 0.7864) + .. controls ( 0.5078, 0.7926) and ( 0.5191, 0.8406) .. ( 0.5145, 0.8567) + .. controls ( 0.5121, 0.8651) and ( 0.5076, 0.8710) .. ( 0.5025, 0.8764) + --cycle + ( 0.3773, 0.8153) + .. controls ( 0.3625, 0.7892) and ( 0.2993, 0.7161) .. ( 0.3316, 0.6877) + .. controls ( 0.3432, 0.6774) and ( 0.3866, 0.6728) .. ( 0.4029, 0.6706) + -- ( 0.3973, 0.7472) + -- ( 0.4029, 0.8153) + --cycle + (-0.4224, 0.8088) + .. controls (-0.4416, 0.8077) and (-0.4585, 0.7826) .. (-0.4275, 0.7562) + -- (-0.3971, 0.7387) + .. controls (-0.4780, 0.6942) and (-0.4752, 0.6640) .. (-0.4591, 0.5855) + .. controls (-0.4391, 0.4887) and (-0.4527, 0.5347) .. (-0.4103, 0.4493) + .. controls (-0.3870, 0.4026) and (-0.4070, 0.3747) .. (-0.3460, 0.3642) + -- (-0.3352, 0.4823) + .. controls (-0.3409, 0.5024) and (-0.3617, 0.5113) .. (-0.3739, 0.5281) + -- (-0.4164, 0.6287) + .. controls (-0.4188, 0.6375) and (-0.4186, 0.6444) .. (-0.4164, 0.6528) + .. controls (-0.4067, 0.6807) and (-0.3521, 0.7255) .. (-0.3274, 0.6931) + .. controls (-0.3070, 0.6694) and (-0.3336, 0.6432) .. (-0.3274, 0.6221) + .. controls (-0.3249, 0.6055) and (-0.3059, 0.6028) .. (-0.2950, 0.6162) + .. controls (-0.2867, 0.6265) and (-0.2838, 0.6558) .. (-0.2829, 0.6692) + .. controls (-0.2775, 0.7444) and (-0.3333, 0.7652) .. (-0.3955, 0.7472) + .. controls (-0.3950, 0.7586) and (-0.3916, 0.7684) .. (-0.3955, 0.7803) + .. controls (-0.3986, 0.8016) and (-0.4109, 0.8096) .. (-0.4224, 0.8088) + --cycle + (-0.1391, 0.8077) + .. controls (-0.1634, 0.8024) and (-0.1582, 0.7647) .. (-0.1487, 0.7492) + .. controls (-0.1306, 0.7190) and (-0.1004, 0.7270) .. (-0.0652, 0.7073) + -- (-0.0226, 0.6801) + -- ( 0.0282, 0.6560) + .. controls ( 0.0622, 0.6331) and ( 0.0955, 0.5639) .. ( 0.1219, 0.5259) + .. controls ( 0.2125, 0.5714) and ( 0.1427, 0.6114) .. ( 0.1219, 0.6453) + -- ( 0.1054, 0.6768) + .. controls ( 0.0862, 0.7028) and ( 0.0448, 0.7080) .. ( 0.0115, 0.7299) + .. controls (-0.0377, 0.7622) and (-0.0173, 0.7726) .. (-0.0822, 0.7918) + .. controls (-0.0961, 0.7958) and (-0.1270, 0.8103) .. (-0.1391, 0.8077) + --cycle + (-0.5460, 0.7940) + -- (-0.5911, 0.7166) + .. controls (-0.5649, 0.7015) and (-0.5397, 0.7188) .. (-0.5308, 0.7556) + .. controls (-0.5251, 0.7788) and (-0.5335, 0.7873) .. (-0.5460, 0.7940) + --cycle + (-0.2382, 0.7423) + .. controls (-0.2453, 0.7424) and (-0.2512, 0.7383) .. (-0.2550, 0.7274) + .. controls (-0.2635, 0.7026) and (-0.2353, 0.6726) .. (-0.2229, 0.6536) + .. controls (-0.2031, 0.6234) and (-0.2020, 0.6105) .. (-0.1928, 0.5770) + .. controls (-0.1763, 0.5803) and (-0.1499, 0.5890) .. (-0.1342, 0.5831) + .. controls (-0.1112, 0.5745) and (-0.1047, 0.5481) .. (-0.0866, 0.5338) + -- (-0.0397, 0.5102) + -- ( 0.0664, 0.4219) + .. controls ( 0.0874, 0.3954) and ( 0.0785, 0.3655) .. ( 0.1070, 0.3502) + .. controls ( 0.1367, 0.3343) and ( 0.1690, 0.3592) .. ( 0.1732, 0.3899) + .. controls ( 0.1755, 0.4075) and ( 0.1545, 0.4554) .. ( 0.1475, 0.4748) + .. controls ( 0.0838, 0.4666) and ( 0.0509, 0.4836) .. ( 0.0454, 0.5515) + .. controls (-0.0576, 0.5778) and (-0.0955, 0.6323) .. (-0.1754, 0.6949) + .. controls (-0.1861, 0.7034) and (-0.2171, 0.7418) .. (-0.2382, 0.7423) + --cycle + (-0.5068, 0.6706) + .. controls (-0.5119, 0.6724) and (-0.5194, 0.6726) .. (-0.5299, 0.6701) + .. controls (-0.5512, 0.6413) and (-0.5242, 0.6333) .. (-0.5102, 0.6400) + .. controls (-0.4981, 0.6457) and (-0.4916, 0.6653) .. (-0.5068, 0.6706) + --cycle + (-0.6356, 0.6402) + -- (-0.6681, 0.5845) + -- (-0.6588, 0.5684) + .. controls (-0.6473, 0.5521) and (-0.6323, 0.5371) .. (-0.6265, 0.5174) + .. controls (-0.6174, 0.4865) and (-0.6614, 0.4161) .. (-0.6950, 0.4206) + .. controls (-0.7111, 0.4226) and (-0.7174, 0.4376) .. (-0.7460, 0.4507) + -- (-0.7632, 0.4212) + .. controls (-0.7629, 0.4042) and (-0.7611, 0.3875) .. (-0.7546, 0.3789) + .. controls (-0.7424, 0.3626) and (-0.7129, 0.3612) .. (-0.6966, 0.3297) + .. controls (-0.6823, 0.3022) and (-0.6963, 0.2741) .. (-0.6808, 0.2598) + .. controls (-0.6602, 0.2410) and (-0.6495, 0.2720) .. (-0.6484, 0.2878) + .. controls (-0.6461, 0.3229) and (-0.6488, 0.4046) .. (-0.6080, 0.4204) + .. controls (-0.5750, 0.4330) and (-0.4980, 0.3514) .. (-0.4929, 0.3217) + .. controls (-0.4895, 0.3019) and (-0.5044, 0.2671) .. (-0.4860, 0.2550) + .. controls (-0.4691, 0.2439) and (-0.4582, 0.2679) .. (-0.4535, 0.2796) + .. controls (-0.4450, 0.3015) and (-0.4273, 0.3562) .. (-0.4401, 0.3771) + .. controls (-0.4495, 0.3922) and (-0.5019, 0.4172) .. (-0.5296, 0.4507) + .. controls (-0.5656, 0.4941) and (-0.5734, 0.5631) .. (-0.5973, 0.6021) + .. controls (-0.6099, 0.6226) and (-0.6226, 0.6316) .. (-0.6356, 0.6402) + --cycle + ( 0.2242, 0.6110) + -- ( 0.1816, 0.6025) + -- ( 0.1816, 0.5855) + .. controls ( 0.2117, 0.5815) and ( 0.2140, 0.5821) .. ( 0.2242, 0.6110) + --cycle + ( 0.3924, 0.6049) + .. controls ( 0.3895, 0.6048) and ( 0.3860, 0.6036) .. ( 0.3820, 0.6011) + .. controls ( 0.3535, 0.5835) and ( 0.3670, 0.5238) .. ( 0.3773, 0.5004) + -- ( 0.3944, 0.5004) + -- ( 0.4061, 0.5429) + .. controls ( 0.4082, 0.5540) and ( 0.4130, 0.6056) .. ( 0.3924, 0.6049) + --cycle + (-0.2864, 0.5940) + .. controls (-0.2904, 0.5793) and (-0.2950, 0.5676) .. (-0.2919, 0.5518) + .. controls (-0.2769, 0.4768) and (-0.1616, 0.5041) .. (-0.2162, 0.5623) + .. controls (-0.2236, 0.5702) and (-0.2346, 0.5747) .. (-0.2443, 0.5790) + --cycle + (-0.7010, 0.5280) + -- (-0.7269, 0.4835) + .. controls (-0.7207, 0.4876) and (-0.7144, 0.4952) .. (-0.7081, 0.5094) + --cycle + (-0.0992, 0.4748) + -- (-0.2099, 0.4556) + -- (-0.2888, 0.3790) + -- (-0.3460, 0.3557) + -- (-0.3389, 0.3218) + .. controls (-0.3310, 0.2959) and (-0.3026, 0.2636) .. (-0.2781, 0.2927) + .. controls (-0.2745, 0.2971) and (-0.2504, 0.3947) .. (-0.1948, 0.3764) + .. controls (-0.1607, 0.3651) and (-0.1697, 0.2984) .. (-0.1588, 0.2536) + -- (-0.1503, 0.2536) + -- (-0.1503, 0.2450) + -- (-0.1163, 0.2366) + .. controls (-0.0968, 0.3059) and (-0.1262, 0.3371) .. (-0.1239, 0.3982) + .. controls (-0.1229, 0.4261) and (-0.1067, 0.4484) .. (-0.0992, 0.4748) + --cycle + (-0.1503, 0.2450) + -- (-0.1588, 0.2536) + .. controls (-0.2292, 0.2544) and (-0.2730, 0.2893) .. (-0.2677, 0.2195) + -- (-0.2609, 0.1855) + .. controls (-0.2393, 0.1890) and (-0.2005, 0.2039) .. (-0.1909, 0.1753) + .. controls (-0.1709, 0.1163) and (-0.2582, 0.0953) .. (-0.2387, 0.0533) + .. controls (-0.2275, 0.0292) and (-0.1430, 0.0537) .. (-0.1361, 0.0692) + .. controls (-0.1250, 0.0859) and (-0.1359, 0.1083) .. (-0.1361, 0.1259) + .. controls (-0.1437, 0.1788) and (-0.1186, 0.1766) .. (-0.1503, 0.2450) + --cycle + ( 0.7348, 0.4408) + .. controls ( 0.7113, 0.3774) and ( 0.7569, 0.3513) .. ( 0.7901, 0.3824) + -- ( 0.7585, 0.4390) + --cycle + ( 0.2071, 0.4153) + .. controls ( 0.1984, 0.3706) and ( 0.2118, 0.3204) .. ( 0.2582, 0.3046) + .. controls ( 0.2685, 0.3631) and ( 0.2706, 0.3931) .. ( 0.2071, 0.4153) + --cycle + (-0.0567, 0.3982) + .. controls (-0.0558, 0.3230) and (-0.0460, 0.3456) .. (-0.0210, 0.2876) + -- ( 0.0067, 0.1940) + .. controls ( 0.0180, 0.1513) and ( 0.0026, 0.1332) .. ( 0.0454, 0.1089) + -- ( 0.0767, 0.1940) + -- ( 0.0546, 0.2621) + -- ( 0.0406, 0.3185) + -- (-0.0258, 0.3896) + --cycle + (-0.7969, 0.3634) + -- (-0.8570, 0.2602) + .. controls (-0.8515, 0.2550) and (-0.8469, 0.2514) .. (-0.8414, 0.2450) + .. controls (-0.8020, 0.1990) and (-0.8201, 0.1971) .. (-0.7629, 0.1540) + .. controls (-0.7462, 0.1414) and (-0.7054, 0.1023) .. (-0.6834, 0.1181) + .. controls (-0.6662, 0.1304) and (-0.6813, 0.1625) .. (-0.6882, 0.1768) + .. controls (-0.7213, 0.2456) and (-0.7865, 0.2417) .. (-0.8004, 0.2965) + .. controls (-0.8052, 0.3154) and (-0.7990, 0.3413) .. (-0.7969, 0.3634) + --cycle + ( 0.8244, 0.3214) + .. controls ( 0.8136, 0.3128) and ( 0.8080, 0.2984) .. ( 0.8114, 0.2706) + .. controls ( 0.8314, 0.2739) and ( 0.8424, 0.2735) .. ( 0.8526, 0.2710) + --cycle + ( 0.5015, 0.3207) + .. controls ( 0.4943, 0.3196) and ( 0.4861, 0.3171) .. ( 0.4766, 0.3130) + .. controls ( 0.4611, 0.2827) and ( 0.4839, 0.2747) .. ( 0.5028, 0.2521) + -- ( 0.5376, 0.1972) + .. controls ( 0.5529, 0.1772) and ( 0.5728, 0.1698) .. ( 0.5845, 0.1426) + .. controls ( 0.5979, 0.1115) and ( 0.5837, 0.0732) .. ( 0.5987, 0.0532) + .. controls ( 0.6095, 0.0384) and ( 0.6236, 0.0428) .. ( 0.6350, 0.0532) + .. controls ( 0.6681, 0.0842) and ( 0.6456, 0.1087) .. ( 0.6482, 0.1429) + .. controls ( 0.6481, 0.1614) and ( 0.6596, 0.1802) .. ( 0.6482, 0.1967) + .. controls ( 0.6390, 0.2131) and ( 0.5992, 0.2239) .. ( 0.5768, 0.2483) + .. controls ( 0.5547, 0.2722) and ( 0.5524, 0.3288) .. ( 0.5015, 0.3207) + --cycle + (-0.5678, 0.3115) + .. controls (-0.5832, 0.3118) and (-0.6140, 0.2810) .. (-0.6269, 0.2706) + .. controls (-0.6185, 0.2412) and (-0.5926, 0.1953) .. (-0.5973, 0.1685) + .. controls (-0.6029, 0.1373) and (-0.6320, 0.1239) .. (-0.6369, 0.0996) + .. controls (-0.6406, 0.0816) and (-0.6303, 0.0652) .. (-0.6237, 0.0493) + .. controls (-0.6147, 0.0275) and (-0.6000,-0.0443) .. (-0.5641,-0.0258) + .. controls (-0.5134,-0.0018) and (-0.5902, 0.0606) .. (-0.5641, 0.1074) + .. controls (-0.5332, 0.1697) and (-0.4913, 0.1444) .. (-0.4481, 0.1593) + .. controls (-0.3913, 0.1792) and (-0.3439, 0.2446) .. (-0.3545, 0.3046) + -- (-0.4568, 0.2201) + -- (-0.5588, 0.2201) + .. controls (-0.5549, 0.2390) and (-0.5305, 0.3109) .. (-0.5678, 0.3115) + --cycle + ( 0.2243, 0.2813) + -- ( 0.1631, 0.2450) + -- ( 0.0965, 0.2281) + -- ( 0.1689, 0.1131) + -- ( 0.2065, 0.0861) + .. controls ( 0.2453, 0.0564) and ( 0.2384, 0.0410) .. ( 0.2923, 0.0323) + -- ( 0.2988,-0.0188) + .. controls ( 0.2994,-0.0695) and ( 0.2657,-0.0796) .. ( 0.2249,-0.0579) + .. controls ( 0.1337,-0.0093) and ( 0.1545, 0.0219) .. ( 0.1102, 0.0744) + .. controls ( 0.0914, 0.0967) and ( 0.0807, 0.1010) .. ( 0.0539, 0.1089) + .. controls ( 0.0562, 0.0613) and ( 0.0756,-0.0434) .. ( 0.0403,-0.0825) + .. controls ( 0.0293,-0.0948) and (-0.0336,-0.1168) .. (-0.0567,-0.1294) + .. controls (-0.0615,-0.1087) and (-0.0777,-0.0729) .. (-0.0703,-0.0546) + .. controls (-0.0586,-0.0251) and ( 0.0562, 0.0040) .. (-0.0152, 0.0389) + -- (-0.0397, 0.0480) + -- (-0.0737, 0.0578) + .. controls (-0.0806, 0.0391) and (-0.0849, 0.0192) .. (-0.1018, 0.0068) + .. controls (-0.1154,-0.0032) and (-0.1352,-0.0018) .. (-0.1438,-0.0212) + .. controls (-0.1562,-0.0491) and (-0.1117,-0.1243) .. (-0.0874,-0.1373) + .. controls (-0.0745,-0.1434) and (-0.0687,-0.1394) .. (-0.0567,-0.1373) + .. controls (-0.0358,-0.2033) and (-0.0062,-0.1612) .. ( 0.0370,-0.1500) + -- ( 0.1050,-0.1379) + .. controls ( 0.0882,-0.0871) and ( 0.0808,-0.0999) .. ( 0.0965,-0.0443) + .. controls ( 0.1454,-0.0619) and ( 0.1336,-0.0743) .. ( 0.1664,-0.0940) + .. controls ( 0.1897,-0.1081) and ( 0.2226,-0.1052) .. ( 0.2361,-0.1388) + .. controls ( 0.2495,-0.1724) and ( 0.2245,-0.1963) .. ( 0.2412,-0.2584) + .. controls ( 0.2526,-0.2569) and ( 0.2622,-0.2548) .. ( 0.2735,-0.2584) + .. controls ( 0.2987,-0.2708) and ( 0.3225,-0.3241) .. ( 0.3212,-0.3506) + .. controls ( 0.3203,-0.3711) and ( 0.3053,-0.3950) .. ( 0.3008,-0.4443) + -- ( 0.2497,-0.4187) + .. controls ( 0.2599,-0.4479) and ( 0.2621,-0.4475) .. ( 0.2905,-0.4528) + .. controls ( 0.2877,-0.4715) and ( 0.2799,-0.4998) .. ( 0.2905,-0.5182) + .. controls ( 0.2991,-0.5392) and ( 0.3228,-0.5357) .. ( 0.3346,-0.5182) + .. controls ( 0.3506,-0.4943) and ( 0.3355,-0.4515) .. ( 0.3532,-0.4203) + .. controls ( 0.3716,-0.3881) and ( 0.4096,-0.3844) .. ( 0.4084,-0.3499) + .. controls ( 0.4074,-0.3241) and ( 0.3866,-0.3087) .. ( 0.3728,-0.2897) + -- ( 0.3426,-0.2337) + -- ( 0.2989,-0.1879) + .. controls ( 0.2810,-0.1587) and ( 0.2976,-0.1327) .. ( 0.3187,-0.1323) + .. controls ( 0.3342,-0.1319) and ( 0.3489,-0.1451) .. ( 0.3603,-0.1541) + .. controls ( 0.3817,-0.1712) and ( 0.4026,-0.1894) .. ( 0.4144,-0.2146) + .. controls ( 0.4299,-0.2477) and ( 0.4289,-0.2977) .. ( 0.4712,-0.3110) + .. controls ( 0.4957,-0.3188) and ( 0.5167,-0.3024) .. ( 0.5044,-0.2753) + .. controls ( 0.4967,-0.2585) and ( 0.4769,-0.2471) .. ( 0.4676,-0.2227) + .. controls ( 0.4582,-0.1981) and ( 0.4681,-0.1743) .. ( 0.4488,-0.1492) + .. controls ( 0.4286,-0.1227) and ( 0.3809,-0.1095) .. ( 0.3621,-0.0696) + .. controls ( 0.3402,-0.0230) and ( 0.3896, 0.0270) .. ( 0.3092, 0.0408) + -- ( 0.3532, 0.1933) + -- ( 0.3944, 0.2536) + -- ( 0.3433, 0.2765) + --cycle + ( 0.2497, 0.2450) + -- ( 0.2782, 0.2025) + .. controls ( 0.2843, 0.1911) and ( 0.2884, 0.1815) .. ( 0.2900, 0.1685) + .. controls ( 0.3021, 0.0654) and ( 0.1495, 0.1479) .. ( 0.2135, 0.2245) + .. controls ( 0.2246, 0.2378) and ( 0.2346, 0.2396) .. ( 0.2497, 0.2450) + --cycle + ( 0.8836, 0.2157) + .. controls ( 0.8688, 0.2061) and ( 0.8571, 0.1889) .. ( 0.8687, 0.1736) + .. controls ( 0.8785, 0.1608) and ( 0.8967, 0.1613) .. ( 0.9161, 0.1578) + --cycle + (-0.3035, 0.1940) + .. controls (-0.3340, 0.1390) and (-0.3508, 0.1491) .. (-0.3624, 0.1300) + .. controls (-0.3738, 0.1112) and (-0.3588, 0.0896) .. (-0.3288, 0.0972) + .. controls (-0.2842, 0.1084) and (-0.2392, 0.1714) .. (-0.3035, 0.1940) + --cycle + ( 0.4710, 0.1940) + .. controls ( 0.4330, 0.1525) and ( 0.3961, 0.1447) .. ( 0.4114, 0.0833) + .. controls ( 0.4294, 0.0897) and ( 0.4596, 0.1056) .. ( 0.4776, 0.0984) + .. controls ( 0.5010, 0.0888) and ( 0.5182, 0.0420) .. ( 0.4925, 0.0231) + .. controls ( 0.4698, 0.0064) and ( 0.4500, 0.0299) .. ( 0.3944, 0.0153) + .. controls ( 0.4243,-0.0189) and ( 0.4618,-0.0333) .. ( 0.4765,-0.0621) + .. controls ( 0.4928,-0.0939) and ( 0.4729,-0.1183) .. ( 0.4881,-0.1406) + .. controls ( 0.4977,-0.1549) and ( 0.5241,-0.1630) .. ( 0.5425,-0.1894) + .. controls ( 0.5557,-0.2085) and ( 0.5562,-0.2282) .. ( 0.5657,-0.2485) + -- ( 0.6122,-0.3251) + .. controls ( 0.6335,-0.3720) and ( 0.6160,-0.3973) .. ( 0.6323,-0.4443) + .. controls ( 0.6532,-0.5042) and ( 0.6754,-0.5231) .. ( 0.6973,-0.5440) + -- ( 0.7289,-0.4899) + .. controls ( 0.7138,-0.4739) and ( 0.6992,-0.4579) .. ( 0.6886,-0.4358) + -- ( 0.6489,-0.2690) + .. controls ( 0.6485,-0.2445) and ( 0.6654,-0.2180) .. ( 0.6598,-0.2002) + .. controls ( 0.6522,-0.1752) and ( 0.6202,-0.1899) .. ( 0.5938,-0.1612) + .. controls ( 0.5619,-0.1263) and ( 0.5907,-0.0980) .. ( 0.5797,-0.0720) + .. controls ( 0.5714,-0.0525) and ( 0.5434,-0.0441) .. ( 0.5374,-0.0184) + .. controls ( 0.5319, 0.0056) and ( 0.5522, 0.0300) .. ( 0.5533, 0.0578) + .. controls ( 0.5548, 0.0943) and ( 0.4981, 0.1701) .. ( 0.4710, 0.1940) + --cycle + (-0.9001, 0.1862) + -- (-0.9386, 0.1201) + .. controls (-0.9374, 0.1181) and (-0.9371, 0.1158) .. (-0.9356, 0.1139) + .. controls (-0.9242, 0.0996) and (-0.9046, 0.0893) .. (-0.8911, 0.0660) + .. controls (-0.8684, 0.0268) and (-0.8960, 0.0297) .. (-0.8592,-0.0296) + .. controls (-0.8262,-0.0830) and (-0.8655,-0.1092) .. (-0.7971,-0.1209) + -- (-0.7875, 0.0068) + -- (-0.8579, 0.1174) + --cycle + (-0.4453, 0.0979) + .. controls (-0.4922, 0.0916) and (-0.4988, 0.0347) .. (-0.4759, 0.0116) + .. controls (-0.4491,-0.0149) and (-0.4165, 0.0208) .. (-0.3900, 0.0116) + .. controls (-0.3555,-0.0011) and (-0.3800,-0.0410) .. (-0.3751,-0.0698) + -- (-0.3537,-0.1294) + .. controls (-0.3428,-0.1879) and (-0.4042,-0.1777) .. (-0.3801,-0.2656) + .. controls (-0.3617,-0.2531) and (-0.3352,-0.2292) .. (-0.3122,-0.2330) + .. controls (-0.2845,-0.2375) and (-0.2669,-0.2694) .. (-0.2543,-0.2911) + .. controls (-0.2183,-0.3533) and (-0.2004,-0.3613) .. (-0.2184,-0.4358) + .. controls (-0.3300,-0.4097) and (-0.2723,-0.5065) .. (-0.2483,-0.5549) + -- (-0.2129,-0.6314) + .. controls (-0.2017,-0.6508) and (-0.1900,-0.6661) .. (-0.1670,-0.6712) + .. controls (-0.1211,-0.6813) and (-0.1100,-0.6527) .. (-0.1163,-0.6145) + .. controls (-0.1327,-0.6119) and (-0.1427,-0.6118) .. (-0.1568,-0.6009) + .. controls (-0.1780,-0.5845) and (-0.2123,-0.5041) .. (-0.2042,-0.4783) + .. controls (-0.1947,-0.4484) and (-0.1575,-0.4121) .. (-0.1333,-0.3932) + -- (-0.1527,-0.3251) + -- (-0.1588,-0.2656) + .. controls (-0.2187,-0.2715) and (-0.2083,-0.2536) .. (-0.2457,-0.2163) + .. controls (-0.2684,-0.1935) and (-0.2911,-0.1886) .. (-0.2996,-0.1546) + -- (-0.2996,-0.1209) + -- (-0.3232,-0.0698) + .. controls (-0.3283,-0.0435) and (-0.3124,-0.0260) .. (-0.3175,-0.0041) + .. controls (-0.3251, 0.0283) and (-0.3891, 0.0917) .. (-0.4227, 0.0973) + .. controls (-0.4311, 0.0987) and (-0.4386, 0.0989) .. (-0.4453, 0.0979) + --cycle + (-0.1163,-0.6145) + -- (-0.0812,-0.6009) + -- (-0.0509,-0.4868) + -- (-0.0567,-0.4528) + .. controls (-0.1227,-0.4845) and (-0.1350,-0.5483) .. (-0.1163,-0.6145) + --cycle + ( 0.9165, 0.0573) + .. controls ( 0.8982, 0.0512) and ( 0.8800, 0.0260) .. ( 0.8880,-0.0013) + .. controls ( 0.8973,-0.0334) and ( 0.9330,-0.0408) .. ( 0.9466,-0.0703) + .. controls ( 0.9528,-0.0838) and ( 0.9514,-0.0964) .. ( 0.9506,-0.1091) + -- ( 1.0000,-0.0243) + .. controls ( 0.9816,-0.0179) and ( 0.9678,-0.0119) .. ( 0.9563, 0.0077) + .. controls ( 0.9465, 0.0244) and ( 0.9476, 0.0488) .. ( 0.9340, 0.0564) + .. controls ( 0.9288, 0.0593) and ( 0.9227, 0.0593) .. ( 0.9165, 0.0573) + --cycle + (-0.7064, 0.0069) + .. controls (-0.7128, 0.0077) and (-0.7187, 0.0075) .. (-0.7237, 0.0061) + .. controls (-0.7255, 0.0030) and (-0.7310, 0.0025) .. (-0.7316,-0.0115) + .. controls (-0.7321,-0.0230) and (-0.7071,-0.1058) .. (-0.6984,-0.1096) + .. controls (-0.6872,-0.1176) and (-0.6721,-0.1116) .. (-0.6609,-0.1096) + .. controls (-0.6502,-0.1046) and (-0.6316,-0.0986) .. (-0.6242,-0.0900) + .. controls (-0.5901,-0.0507) and (-0.6615, 0.0017) .. (-0.7064, 0.0069) + --cycle + (-1.0000, 0.0068) + -- (-1.0000, 0.0020) + -- (-0.9548,-0.0788) + .. controls (-0.9170,-0.0310) and (-0.9342,-0.0158) .. (-1.0000, 0.0068) + --cycle + (-0.2643, 0.0054) + .. controls (-0.2853,-0.0295) and (-0.2523,-0.0713) .. (-0.2182,-0.0843) + .. controls (-0.2024,-0.0902) and (-0.1781,-0.0944) .. (-0.1687,-0.0757) + .. controls (-0.1530,-0.0441) and (-0.2378, 0.0095) .. (-0.2643, 0.0054) + --cycle + ( 0.6299,-0.0102) + .. controls ( 0.6155,-0.0145) and ( 0.6071,-0.0342) .. ( 0.6128,-0.0510) + .. controls ( 0.6198,-0.0721) and ( 0.6440,-0.0790) .. ( 0.6606,-0.0986) + .. controls ( 0.6738,-0.1143) and ( 0.6761,-0.1328) .. ( 0.6948,-0.1437) + .. controls ( 0.7092,-0.1520) and ( 0.7311,-0.1484) .. ( 0.7401,-0.1664) + .. controls ( 0.7461,-0.1784) and ( 0.7351,-0.2363) .. ( 0.7348,-0.2570) + .. controls ( 0.7336,-0.3524) and ( 0.7289,-0.3324) .. ( 0.7620,-0.4187) + .. controls ( 0.7631,-0.4216) and ( 0.7642,-0.4246) .. ( 0.7652,-0.4275) + -- ( 0.8003,-0.3672) + .. controls ( 0.7976,-0.3636) and ( 0.7942,-0.3606) .. ( 0.7918,-0.3568) + .. controls ( 0.7778,-0.3349) and ( 0.7645,-0.2537) .. ( 0.7970,-0.2417) + .. controls ( 0.8206,-0.2330) and ( 0.8347,-0.2671) .. ( 0.8432,-0.2822) + -- ( 0.8469,-0.2872) + -- ( 0.8787,-0.2326) + -- ( 0.8594,-0.1993) + .. controls ( 0.8496,-0.1847) and ( 0.7996,-0.1314) .. ( 0.7847,-0.1281) + .. controls ( 0.7712,-0.1229) and ( 0.7642,-0.1268) .. ( 0.7518,-0.1281) + .. controls ( 0.7451,-0.1148) and ( 0.7397,-0.1014) .. ( 0.7293,-0.0886) + -- ( 0.6461,-0.0117) + .. controls ( 0.6402,-0.0090) and ( 0.6347,-0.0087) .. ( 0.6299,-0.0102) + --cycle + (-0.5178,-0.0844) + .. controls (-0.5451,-0.0820) and (-0.5852,-0.0947) .. (-0.5902,-0.1144) + .. controls (-0.6007,-0.1557) and (-0.5621,-0.1731) .. (-0.5414,-0.1997) + .. controls (-0.5274,-0.2177) and (-0.5229,-0.2355) .. (-0.5044,-0.2525) + .. controls (-0.4888,-0.2669) and (-0.4706,-0.2705) .. (-0.4543,-0.2923) + .. controls (-0.4420,-0.3087) and (-0.4220,-0.3707) .. (-0.4141,-0.3932) + .. controls (-0.3620,-0.3875) and (-0.3060,-0.4031) .. (-0.3060,-0.3592) + .. controls (-0.3060,-0.3272) and (-0.3358,-0.3272) .. (-0.3716,-0.3008) + .. controls (-0.4367,-0.2529) and (-0.4253,-0.2451) .. (-0.4621,-0.1914) + .. controls (-0.4700,-0.1800) and (-0.4814,-0.1685) .. (-0.4867,-0.1556) + .. controls (-0.4970,-0.1308) and (-0.4804,-0.1088) .. (-0.4966,-0.0923) + .. controls (-0.5011,-0.0877) and (-0.5087,-0.0853) .. (-0.5178,-0.0844) + --cycle + (-0.4165,-0.0846) + .. controls (-0.4357,-0.0807) and (-0.4622,-0.1075) .. (-0.4395,-0.1440) + .. controls (-0.4316,-0.1566) and (-0.4254,-0.1571) .. (-0.4141,-0.1634) + .. controls (-0.4094,-0.1522) and (-0.4042,-0.1415) .. (-0.4019,-0.1294) + .. controls (-0.3960,-0.1004) and (-0.4049,-0.0870) .. (-0.4165,-0.0846) + --cycle + (-0.9358,-0.1125) + -- (-0.8813,-0.2098) + .. controls (-0.8768,-0.1903) and (-0.8656,-0.1673) .. (-0.8723,-0.1485) + .. controls (-0.8801,-0.1269) and (-0.9022,-0.1274) .. (-0.9358,-0.1125) + --cycle + ( 0.1455,-0.1458) + .. controls ( 0.1402,-0.1449) and ( 0.1336,-0.1452) .. ( 0.1255,-0.1471) + .. controls ( 0.0901,-0.1850) and ( 0.1064,-0.2454) .. ( 0.1360,-0.2301) + .. controls ( 0.1569,-0.2194) and ( 0.1827,-0.1522) .. ( 0.1455,-0.1458) + --cycle + (-0.1477,-0.1474) + .. controls (-0.1646,-0.1458) and (-0.1813,-0.1543) .. (-0.1847,-0.1659) + .. controls (-0.1889,-0.1806) and (-0.1612,-0.2953) .. (-0.1163,-0.2315) + -- (-0.0420,-0.4418) + .. controls (-0.0291,-0.4661) and (-0.0068,-0.4600) .. ( 0.0136,-0.4880) + .. controls ( 0.0294,-0.5097) and ( 0.0259,-0.5331) .. ( 0.0419,-0.5487) + .. controls ( 0.0694,-0.5755) and ( 0.1462,-0.5710) .. ( 0.1798,-0.6001) + -- ( 0.2188,-0.6436) + .. controls ( 0.2392,-0.6605) and ( 0.2566,-0.6577) .. ( 0.2804,-0.6838) + .. controls ( 0.3122,-0.7186) and ( 0.3037,-0.7586) .. ( 0.3603,-0.7592) + .. controls ( 0.3537,-0.7217) and ( 0.3358,-0.6781) .. ( 0.3603,-0.6427) + .. controls ( 0.3743,-0.6222) and ( 0.3978,-0.6232) .. ( 0.4032,-0.6039) + .. controls ( 0.4084,-0.5852) and ( 0.3901,-0.5654) .. ( 0.3712,-0.5741) + .. controls ( 0.3573,-0.5804) and ( 0.3558,-0.5936) .. ( 0.3518,-0.6044) + .. controls ( 0.3319,-0.6046) and ( 0.2996,-0.6092) .. ( 0.2842,-0.6044) + .. controls ( 0.2568,-0.5917) and ( 0.2515,-0.5648) .. ( 0.2231,-0.5501) + .. controls ( 0.1960,-0.5359) and ( 0.1632,-0.5421) .. ( 0.1413,-0.5292) + -- ( 0.0626,-0.4601) + .. controls ( 0.0525,-0.4430) and ( 0.0547,-0.4207) .. ( 0.0440,-0.4065) + .. controls ( 0.0320,-0.3906) and ( 0.0076,-0.3898) .. (-0.0104,-0.3714) + .. controls (-0.0515,-0.3289) and ( 0.0146,-0.2721) .. (-0.0737,-0.2358) + .. controls (-0.0903,-0.2290) and (-0.0917,-0.2313) .. (-0.1098,-0.2315) + -- (-0.1098,-0.1892) + .. controls (-0.1137,-0.1607) and (-0.1308,-0.1491) .. (-0.1477,-0.1474) + --cycle + (-0.7679,-0.1481) + .. controls (-0.8119,-0.1523) and (-0.8157,-0.2051) .. (-0.8303,-0.2401) + -- (-0.8453,-0.2740) + -- (-0.8299,-0.3015) + .. controls (-0.7861,-0.2968) and (-0.8116,-0.2403) .. (-0.7732,-0.2278) + .. controls (-0.7561,-0.2223) and (-0.7349,-0.2415) .. (-0.7204,-0.2497) + .. controls (-0.6711,-0.2774) and (-0.6473,-0.2864) .. (-0.6524,-0.3506) + -- (-0.6787,-0.3422) + .. controls (-0.6786,-0.3475) and (-0.6826,-0.3544) .. (-0.6787,-0.3655) + .. controls (-0.6635,-0.4244) and (-0.5943,-0.3658) .. (-0.5763,-0.3760) + .. controls (-0.5586,-0.3861) and (-0.5497,-0.4251) .. (-0.5357,-0.4418) + .. controls (-0.5118,-0.4701) and (-0.4694,-0.4662) .. (-0.4504,-0.5047) + .. controls (-0.4231,-0.5599) and (-0.4535,-0.6772) .. (-0.4451,-0.7421) + .. controls (-0.4389,-0.7901) and (-0.4023,-0.8005) .. (-0.3912,-0.8443) + .. controls (-0.3883,-0.8558) and (-0.3874,-0.8667) .. (-0.3869,-0.8774) + -- (-0.3386,-0.8778) + .. controls (-0.3371,-0.8645) and (-0.3342,-0.8523) .. (-0.3394,-0.8358) + .. controls (-0.3448,-0.8167) and (-0.3914,-0.7567) .. (-0.3962,-0.6996) + .. controls (-0.4039,-0.6074) and (-0.3294,-0.5871) .. (-0.3545,-0.4954) + -- (-0.3886,-0.5039) + -- (-0.4196,-0.4442) + -- (-0.4864,-0.4090) + -- (-0.5345,-0.3241) + -- (-0.6106,-0.2802) + -- (-0.6106,-0.1975) + .. controls (-0.6301,-0.2027) and (-0.6486,-0.2101) .. (-0.6694,-0.2022) + .. controls (-0.7004,-0.1904) and (-0.7133,-0.1559) .. (-0.7464,-0.1495) + .. controls (-0.7544,-0.1479) and (-0.7616,-0.1475) .. (-0.7679,-0.1481) + --cycle + ( 0.0029,-0.2060) + .. controls (-0.0139,-0.2731) and ( 0.0196,-0.2608) .. ( 0.0476,-0.3014) + .. controls ( 0.0682,-0.3314) and ( 0.0511,-0.3569) .. ( 0.0750,-0.3784) + .. controls ( 0.0974,-0.3988) and ( 0.1304,-0.3876) .. ( 0.1549,-0.4019) + .. controls ( 0.1795,-0.4164) and ( 0.1878,-0.4529) .. ( 0.1987,-0.4783) + .. controls ( 0.2461,-0.4539) and ( 0.2519,-0.4021) .. ( 0.2180,-0.3618) + .. controls ( 0.1964,-0.3362) and ( 0.1652,-0.3426) .. ( 0.1414,-0.3257) + .. controls ( 0.1198,-0.3103) and ( 0.1183,-0.2881) .. ( 0.1007,-0.2689) + .. controls ( 0.0838,-0.2504) and ( 0.0265,-0.2166) .. ( 0.0029,-0.2060) + --cycle + ( 0.2327,-0.2826) + .. controls ( 0.1961,-0.2955) and ( 0.1961,-0.3123) .. ( 0.2327,-0.3251) + --cycle + (-0.7548,-0.3137) + .. controls (-0.7774,-0.3164) and (-0.7890,-0.3323) .. (-0.7986,-0.3573) + -- (-0.7759,-0.3979) + .. controls (-0.7735,-0.3968) and (-0.7711,-0.3964) .. (-0.7688,-0.3946) + -- (-0.7205,-0.3166) + .. controls (-0.7341,-0.3135) and (-0.7454,-0.3126) .. (-0.7548,-0.3137) + --cycle + ( 0.4114,-0.3847) + .. controls ( 0.4216,-0.4136) and ( 0.4238,-0.4142) .. ( 0.4540,-0.4102) + -- ( 0.4540,-0.3932) + --cycle + ( 0.5395,-0.3997) + .. controls ( 0.5263,-0.3990) and ( 0.5044,-0.4032) .. ( 0.4625,-0.4018) + -- ( 0.4780,-0.4954) + .. controls ( 0.4757,-0.5287) and ( 0.4518,-0.5542) .. ( 0.4648,-0.5776) + .. controls ( 0.4852,-0.6142) and ( 0.5202,-0.5603) .. ( 0.5614,-0.5929) + .. controls ( 0.5752,-0.6038) and ( 0.6063,-0.6359) .. ( 0.6275,-0.6638) + -- ( 0.6570,-0.6132) + .. controls ( 0.6460,-0.6042) and ( 0.6347,-0.5954) .. ( 0.6268,-0.5865) + -- ( 0.5937,-0.5346) + .. controls ( 0.5648,-0.5023) and ( 0.5031,-0.4880) .. ( 0.5646,-0.4273) + .. controls ( 0.5574,-0.4062) and ( 0.5528,-0.4005) .. ( 0.5395,-0.3997) + --cycle + (-0.6609,-0.4273) + .. controls (-0.7027,-0.4247) and (-0.7300,-0.4414) .. (-0.7397,-0.4624) + -- (-0.7047,-0.5249) + .. controls (-0.7013,-0.5263) and (-0.6989,-0.5282) .. (-0.6950,-0.5294) + .. controls (-0.6935,-0.4878) and (-0.6933,-0.4806) .. (-0.6609,-0.4528) + --cycle + (-0.5689,-0.4528) + .. controls (-0.6368,-0.4677) and (-0.6352,-0.5020) .. (-0.6354,-0.5634) + -- (-0.5757,-0.6071) + -- (-0.5162,-0.6826) + .. controls (-0.5073,-0.6508) and (-0.5037,-0.6125) .. (-0.5241,-0.5838) + .. controls (-0.5384,-0.5639) and (-0.5622,-0.5584) .. (-0.5689,-0.5361) + .. controls (-0.5775,-0.5167) and (-0.5648,-0.4918) .. (-0.5689,-0.4528) + --cycle + (-0.6354,-0.5634) + .. controls (-0.6583,-0.5576) and (-0.6713,-0.5579) .. (-0.6839,-0.5619) + -- (-0.6487,-0.6248) + .. controls (-0.6395,-0.6053) and (-0.6326,-0.5852) .. (-0.6354,-0.5634) + --cycle + (-0.0056,-0.5890) + .. controls (-0.0554,-0.6155) and (-0.0426,-0.6370) .. (-0.0606,-0.6818) + -- (-0.1199,-0.7847) + .. controls (-0.1298,-0.8015) and (-0.1531,-0.8317) .. (-0.1499,-0.8510) + .. controls (-0.1482,-0.8615) and (-0.1397,-0.8702) .. (-0.1295,-0.8795) + -- (-0.0507,-0.8802) + .. controls (-0.0629,-0.8583) and (-0.0745,-0.8380) .. (-0.0742,-0.8358) + .. controls (-0.0792,-0.8239) and (-0.0776,-0.8135) .. (-0.0742,-0.8027) + .. controls (-0.0460,-0.7520) and ( 0.0016,-0.7834) .. ( 0.0277,-0.7780) + .. controls ( 0.0760,-0.7679) and ( 0.1284,-0.6914) .. ( 0.1207,-0.6405) + .. controls ( 0.1150,-0.6017) and ( 0.0841,-0.6082) .. ( 0.0711,-0.6267) + .. controls ( 0.0620,-0.6397) and ( 0.0556,-0.7141) .. ( 0.0539,-0.7336) + .. controls (-0.0413,-0.7085) and ( 0.0139,-0.6637) .. (-0.0056,-0.5890) + --cycle + ( 0.4284,-0.6571) + .. controls ( 0.4285,-0.7307) and ( 0.4284,-0.7652) .. ( 0.5135,-0.7336) + .. controls ( 0.5170,-0.7469) and ( 0.5220,-0.7585) .. ( 0.5179,-0.7726) + .. controls ( 0.5091,-0.8019) and ( 0.4473,-0.8546) .. ( 0.4851,-0.8847) + -- ( 0.4987,-0.8848) + -- ( 0.5768,-0.7509) + .. controls ( 0.5767,-0.7509) and ( 0.5767,-0.7507) .. ( 0.5767,-0.7507) + .. controls ( 0.5412,-0.6652) and ( 0.5083,-0.6726) .. ( 0.4284,-0.6571) + --cycle + (-0.2914,-0.6672) + .. controls (-0.2998,-0.6666) and (-0.3106,-0.6686) .. (-0.3250,-0.6743) + .. controls (-0.3545,-0.7128) and (-0.3081,-0.7358) .. (-0.2850,-0.7678) + .. controls (-0.2710,-0.7873) and (-0.2601,-0.8137) .. (-0.2351,-0.8216) + .. controls (-0.2083,-0.8301) and (-0.1916,-0.8105) .. (-0.1960,-0.7845) + .. controls (-0.2008,-0.7566) and (-0.2232,-0.7418) .. (-0.2396,-0.7216) + .. controls (-0.2612,-0.6950) and (-0.2660,-0.6690) .. (-0.2914,-0.6672) + --cycle + (-0.5641,-0.6998) + .. controls (-0.5850,-0.6984) and (-0.5808,-0.7367) .. (-0.5766,-0.7507) + .. controls (-0.5748,-0.7566) and (-0.5723,-0.7598) .. (-0.5702,-0.7648) + -- (-0.5492,-0.8022) + .. controls (-0.5310,-0.8247) and (-0.5120,-0.8367) .. (-0.5052,-0.8613) + .. controls (-0.5044,-0.8642) and (-0.5062,-0.8717) .. (-0.5063,-0.8763) + -- (-0.4585,-0.8767) + .. controls (-0.4596,-0.7984) and (-0.5013,-0.7963) .. (-0.5234,-0.7583) + .. controls (-0.5344,-0.7394) and (-0.5352,-0.7120) .. (-0.5535,-0.7030) + .. controls (-0.5576,-0.7010) and (-0.5611,-0.7000) .. (-0.5641,-0.6998) + --cycle + ( 0.1990,-0.7341) + .. controls ( 0.1094,-0.7768) and ( 0.2330,-0.8330) .. ( 0.2586,-0.8828) + -- ( 0.3183,-0.8833) + .. controls ( 0.3165,-0.8684) and ( 0.3066,-0.8565) .. ( 0.2991,-0.8428) + .. controls ( 0.2762,-0.8010) and ( 0.2508,-0.7418) .. ( 0.1990,-0.7341) + --cycle + ( 0.3603,-0.7592) + -- ( 0.3859,-0.8188) + .. controls ( 0.4178,-0.7853) and ( 0.4108,-0.7527) .. ( 0.3603,-0.7592) + --cycle + ( 0.4369,-0.8443) + .. controls ( 0.4147,-0.8480) and ( 0.3837,-0.8661) .. ( 0.3628,-0.8837) + -- ( 0.4240,-0.8842) + .. controls ( 0.4307,-0.8690) and ( 0.4358,-0.8541) .. ( 0.4369,-0.8443) + --cycle + (-0.3205,-0.8528) + -- (-0.3266,-0.8779) + -- (-0.2773,-0.8783) + .. controls (-0.2800,-0.8719) and (-0.2850,-0.8655) .. (-0.2963,-0.8600) + --cycle + ( 0.1093,-0.8568) + .. controls ( 0.0964,-0.8568) and ( 0.0834,-0.8587) .. ( 0.0710,-0.8600) + .. controls ( 0.0605,-0.8611) and ( 0.0403,-0.8617) .. ( 0.0312,-0.8664) + .. controls ( 0.0240,-0.8701) and ( 0.0203,-0.8751) .. ( 0.0184,-0.8808) + -- ( 0.1002,-0.8815) + -- ( 0.1050,-0.8698) + -- ( 0.1085,-0.8815) + -- ( 0.1641,-0.8820) + .. controls ( 0.1606,-0.8757) and ( 0.1553,-0.8698) .. ( 0.1463,-0.8649) + .. controls ( 0.1347,-0.8586) and ( 0.1221,-0.8568) .. ( 0.1093,-0.8568) + --cycle + ; + } +} +\fi +% \end{macrocode} +% \end{TikzKey} +% \iffalse +%</hex> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/hex/terrain/city.dtx b/macros/latex/contrib/wargame/source/hex/terrain/city.dtx new file mode 100644 index 0000000000..1d373ea19d --- /dev/null +++ b/macros/latex/contrib/wargame/source/hex/terrain/city.dtx @@ -0,0 +1,5138 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*hex> +% \fi +% \begin{TikzKey}{hex/terrain/city} +% And finally a city +% +% +% \begin{macrocode} +\ifhex@terrain@pic +\tikzset{ + hex/terrain/city/.pic={ + \path[hex/terrain/town/small road,pic actions,hex/terrain/town/post road] + ( 0.6475, 0.4068) + -- ( 0.7314,-0.0575) + -- ( 0.7314,-0.0575) + ; + \path[hex/terrain/town/small road,pic actions,hex/terrain/town/post road] + ( 0.3200,-0.0497) + -- ( 0.7360,-0.0572) + -- ( 0.9222,-0.0903) + -- ( 0.7082,-0.4210) + ; + \path[hex/terrain/town/small road,pic actions,hex/terrain/town/post road] + ( 0.3828, 0.1855) + -- ( 0.0279, 0.1945) + ; + \path[hex/terrain/town/small road,pic actions,hex/terrain/town/post road] + ( 0.0433, 0.3473) + -- ( 0.0217, 0.1444) + ; + \path[hex/terrain/town/small road,pic actions,hex/terrain/town/post road] + ( 0.1413, 0.1884) + -- ( 0.3369,-0.0066) + ; + \path[hex/terrain/town/small road,pic actions,hex/terrain/town/post road] + (-0.1278, 0.7257) + -- (-0.2203, 0.4496) + ; + \path[hex/terrain/town/small road,pic actions,hex/terrain/town/post road] + ( 0.1602, 0.6526) + -- ( 0.0382, 0.6110) + -- (-0.1527, 0.6534) + ; + \path[hex/terrain/town/small road,pic actions,hex/terrain/town/post road] + (-0.1688, 0.6051) + -- (-0.4768, 0.7222) + ; + \path[hex/terrain/town/small road,pic actions,hex/terrain/town/post road] + ( 0.3602,-0.4159) + .. controls ( 0.4139,-0.2355) and ( 0.4139,-0.2352) .. ( 0.4139,-0.2352) + -- ( 0.4838,-0.2184) + -- ( 0.5251,-0.0570) + ; + \path[hex/terrain/town/small road,pic actions,hex/terrain/town/post road] + ( 0.5443,-0.6880) + -- ( 0.5887,-0.5618) + -- ( 0.4781,-0.4650) + -- ( 0.4781,-0.4650) + ; + \path[hex/terrain/town/small road,pic actions,hex/terrain/town/post road] + ( 0.0671,-0.6564) + -- ( 0.2799,-0.7025) + -- ( 0.4360,-0.4711) + ; + \path[hex/terrain/town/small road,pic actions,hex/terrain/town/post road] + ( 0.2023,-0.8374) + -- ( 0.2231,-0.6909) + ; + \path[hex/terrain/town/small road,pic actions,hex/terrain/town/post road] + ( 0.0433,-0.3639) + -- (-0.0931,-0.5036) + -- (-0.3798,-0.4049) + -- (-0.4436,-0.4630) + -- (-0.5468,-0.5027) + -- (-0.6442,-0.3540) + ; + \path[hex/terrain/town/small road,pic actions,hex/terrain/town/post road] + (-0.3296,-0.7486) + -- (-0.3153,-0.6107) + -- (-0.4388,-0.4598) + ; + \path[hex/terrain/town/small road,pic actions,hex/terrain/town/post road] + (-0.3247,-0.6883) + -- (-0.0201,-0.7169) + -- ( 0.0501,-0.7042) + ; + \path[hex/terrain/town/small road,pic actions,hex/terrain/town/post road] + ( 0.0616,-0.6541) + -- (-0.0427,-0.6505) + -- (-0.0229,-0.5387) + ; + \path[hex/terrain/town/small road,pic actions,hex/terrain/town/post road] + ( 0.0040,-0.2086) + -- (-0.1956,-0.1835) + -- (-0.2290,-0.2265) + -- (-0.5068,-0.1372) + ; + \path[hex/terrain/town/small road,pic actions,hex/terrain/town/post road] + (-0.3396, 0.0437) + -- (-0.2201, 0.4506) + ; + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + ( 0.0066, 0.8705) + -- ( 0.3952, 0.3367) + -- ( 0.3885, 0.2021) + -- ( 0.3555, 0.1368) + -- ( 0.3751, 0.0869) + -- ( 0.2511,-0.2014) + -- ( 0.1393,-0.4528) + -- ( 0.0636,-0.6538) + -- ( 0.0063,-0.8731) + -- ( 0.0063,-0.8731) + ; + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + ( 0.1775, 0.6355) + -- ( 0.4288, 0.7459) + -- ( 0.5543, 0.5148) + -- ( 0.5543, 0.5148) + ; + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + ( 0.7584, 0.4363) + -- ( 0.3946, 0.3369) + -- ( 0.3946, 0.3369) + ; + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + ( 0.1428,-0.4540) + -- (-0.0329,-0.2925) + -- ( 0.0739,-0.0364) + -- ( 0.1645,-0.0483) + ; + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + ( 0.0723,-0.0367) + -- (-0.5150, 0.0791) + ; + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + (-0.1911,-0.0821) + -- (-0.0760, 0.3934) + -- (-0.0774, 0.3920) + ; + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + ( 0.0439, 0.3452) + -- (-0.3449, 0.4978) + -- (-0.4614, 0.2954) + -- (-0.4614, 0.2954) + ; + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + (-0.4152, 0.2683) + -- (-0.7626, 0.4390) + -- (-0.7626, 0.4390) + ; + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + (-0.5846, 0.3486) + -- (-0.8106,-0.1286) + -- (-0.7727,-0.2079) + -- (-0.7053,-0.1745) + ; + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + (-0.7161,-0.1542) + -- (-0.6166,-0.3381) + -- (-0.7630,-0.4349) + ; + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + (-0.6697,-0.2422) + -- (-0.4615,-0.1081) + -- (-0.4615,-0.1081) + ; + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + ( 0.2080,-0.3022) + -- ( 0.4581,-0.4878) + -- ( 0.5919,-0.3695) + -- ( 0.7615,-0.4441) + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1146, 0.0405) + -- ( 0.1598, 0.0323) + -- ( 0.1489,-0.0277) + -- ( 0.1036,-0.0196) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1146, 0.0405) + -- ( 0.1598, 0.0323) + -- ( 0.1489,-0.0277) + -- ( 0.1036,-0.0196) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0844, 0.4998) + -- (-0.0599, 0.4835) + -- (-0.0898, 0.4389) + -- (-0.1141, 0.4551) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0844, 0.4998) + -- (-0.0599, 0.4835) + -- (-0.0898, 0.4389) + -- (-0.1141, 0.4551) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6143,-0.0454) + -- (-0.6005,-0.0196) + -- (-0.5531,-0.0447) + -- (-0.5668,-0.0707) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6143,-0.0454) + -- (-0.6005,-0.0196) + -- (-0.5531,-0.0447) + -- (-0.5668,-0.0707) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3809,-0.0792) + -- (-0.3371,-0.0929) + -- (-0.3553,-0.1511) + -- (-0.3991,-0.1375) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3809,-0.0792) + -- (-0.3371,-0.0929) + -- (-0.3553,-0.1511) + -- (-0.3991,-0.1375) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5133, 0.1838) + -- (-0.4733, 0.1613) + -- (-0.5032, 0.1081) + -- (-0.5433, 0.1307) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5133, 0.1838) + -- (-0.4733, 0.1613) + -- (-0.5032, 0.1081) + -- (-0.5433, 0.1307) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3878, 0.1398) + -- (-0.3421, 0.1442) + -- (-0.3362, 0.0834) + -- (-0.3819, 0.0790) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3878, 0.1398) + -- (-0.3421, 0.1442) + -- (-0.3362, 0.0834) + -- (-0.3819, 0.0790) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5622, 0.0806) + -- (-0.5234, 0.0560) + -- (-0.5559, 0.0044) + -- (-0.5948, 0.0290) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5622, 0.0806) + -- (-0.5234, 0.0560) + -- (-0.5559, 0.0044) + -- (-0.5948, 0.0290) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6218, 0.1903) + -- (-0.6097, 0.2346) + -- (-0.5508, 0.2185) + -- (-0.5629, 0.1742) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6218, 0.1903) + -- (-0.6097, 0.2346) + -- (-0.5508, 0.2185) + -- (-0.5629, 0.1742) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2884, 0.7423) + -- (-0.2596, 0.7372) + -- (-0.2691, 0.6843) + -- (-0.2980, 0.6895) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2884, 0.7423) + -- (-0.2596, 0.7372) + -- (-0.2691, 0.6843) + -- (-0.2980, 0.6895) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1219, 0.8731) + -- ( 0.1475, 0.8350) + -- ( 0.0970, 0.8008) + -- ( 0.0712, 0.8389) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1219, 0.8731) + -- ( 0.1475, 0.8350) + -- ( 0.0970, 0.8008) + -- ( 0.0712, 0.8389) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3659, 0.5557) + -- ( 0.3913, 0.5175) + -- ( 0.3405, 0.4837) + -- ( 0.3150, 0.5219) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3659, 0.5557) + -- ( 0.3913, 0.5175) + -- ( 0.3405, 0.4837) + -- ( 0.3150, 0.5219) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0626, 0.4298) + -- ( 0.0896, 0.4184) + -- ( 0.0686, 0.3690) + -- ( 0.0416, 0.3804) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0626, 0.4298) + -- ( 0.0896, 0.4184) + -- ( 0.0686, 0.3690) + -- ( 0.0416, 0.3804) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4510,-0.3094) + -- (-0.4058,-0.2887) + -- (-0.3725,-0.3614) + -- (-0.4176,-0.3821) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4510,-0.3094) + -- (-0.4058,-0.2887) + -- (-0.3725,-0.3614) + -- (-0.4176,-0.3821) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5282,-0.1080) + -- (-0.5533,-0.0695) + -- (-0.5021,-0.0363) + -- (-0.4770,-0.0749) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5282,-0.1080) + -- (-0.5533,-0.0695) + -- (-0.5021,-0.0363) + -- (-0.4770,-0.0749) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0108,-0.2602) + -- ( 0.0173,-0.2316) + -- ( 0.0696,-0.2435) + -- ( 0.0632,-0.2721) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0108,-0.2602) + -- ( 0.0173,-0.2316) + -- ( 0.0696,-0.2435) + -- ( 0.0632,-0.2721) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1989, 0.1654) + -- (-0.1544, 0.1540) + -- (-0.1696, 0.0948) + -- (-0.2141, 0.1063) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1989, 0.1654) + -- (-0.1544, 0.1540) + -- (-0.1696, 0.0948) + -- (-0.2141, 0.1063) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0216,-0.0407) + -- ( 0.0230,-0.0521) + -- ( 0.0078,-0.1112) + -- (-0.0368,-0.0997) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0216,-0.0407) + -- ( 0.0230,-0.0521) + -- ( 0.0078,-0.1112) + -- (-0.0368,-0.0997) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1936, 0.5180) + -- ( 0.2045, 0.4909) + -- ( 0.1547, 0.4709) + -- ( 0.1437, 0.4981) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1936, 0.5180) + -- ( 0.2045, 0.4909) + -- ( 0.1547, 0.4709) + -- ( 0.1437, 0.4981) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1903, 0.4858) + -- (-0.1678, 0.5258) + -- (-0.1146, 0.4960) + -- (-0.1371, 0.4559) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1903, 0.4858) + -- (-0.1678, 0.5258) + -- (-0.1146, 0.4960) + -- (-0.1371, 0.4559) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1470, 0.3493) + -- ( 0.1689, 0.3567) + -- ( 0.1775, 0.3315) + -- ( 0.1555, 0.3241) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1470, 0.3493) + -- ( 0.1689, 0.3567) + -- ( 0.1775, 0.3315) + -- ( 0.1555, 0.3241) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1892, 0.2562) + -- ( 0.2118, 0.2510) + -- ( 0.2058, 0.2251) + -- ( 0.1833, 0.2303) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1892, 0.2562) + -- ( 0.2118, 0.2510) + -- ( 0.2058, 0.2251) + -- ( 0.1833, 0.2303) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.8016, 0.0292) + -- ( 0.8235, 0.0367) + -- ( 0.8321, 0.0116) + -- ( 0.8103, 0.0040) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.8016, 0.0292) + -- ( 0.8235, 0.0367) + -- ( 0.8321, 0.0116) + -- ( 0.8103, 0.0040) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.7392, 0.1737) + -- ( 0.7609, 0.1816) + -- ( 0.7702, 0.1568) + -- ( 0.7485, 0.1487) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.7392, 0.1737) + -- ( 0.7609, 0.1816) + -- ( 0.7702, 0.1568) + -- ( 0.7485, 0.1487) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3736, 0.7805) + -- ( 0.3937, 0.7921) + -- ( 0.4071, 0.7691) + -- ( 0.3870, 0.7575) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3736, 0.7805) + -- ( 0.3937, 0.7921) + -- ( 0.4071, 0.7691) + -- ( 0.3870, 0.7575) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4808,-0.6251) + -- (-0.4706,-0.6459) + -- (-0.4946,-0.6576) + -- (-0.5047,-0.6368) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4808,-0.6251) + -- (-0.4706,-0.6459) + -- (-0.4946,-0.6576) + -- (-0.5047,-0.6368) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4514,-0.6075) + -- (-0.4393,-0.6272) + -- (-0.4620,-0.6412) + -- (-0.4740,-0.6215) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4514,-0.6075) + -- (-0.4393,-0.6272) + -- (-0.4620,-0.6412) + -- (-0.4740,-0.6215) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2390,-0.7174) + -- (-0.2175,-0.7260) + -- (-0.2273,-0.7508) + -- (-0.2489,-0.7421) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2390,-0.7174) + -- (-0.2175,-0.7260) + -- (-0.2273,-0.7508) + -- (-0.2489,-0.7421) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2386,-0.5506) + -- (-0.2108,-0.5598) + -- (-0.2277,-0.6108) + -- (-0.2555,-0.6015) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2386,-0.5506) + -- (-0.2108,-0.5598) + -- (-0.2277,-0.6108) + -- (-0.2555,-0.6015) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3574, 0.2226) + -- (-0.3530, 0.2515) + -- (-0.2999, 0.2435) + -- (-0.3043, 0.2145) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3574, 0.2226) + -- (-0.3530, 0.2515) + -- (-0.2999, 0.2435) + -- (-0.3043, 0.2145) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3315, 0.3242) + -- (-0.3271, 0.3532) + -- (-0.2740, 0.3451) + -- (-0.2783, 0.3162) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3315, 0.3242) + -- (-0.3271, 0.3532) + -- (-0.2740, 0.3451) + -- (-0.2783, 0.3162) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2256, 0.4895) + -- ( 0.2451, 0.4676) + -- ( 0.2049, 0.4320) + -- ( 0.1854, 0.4539) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2256, 0.4895) + -- ( 0.2451, 0.4676) + -- ( 0.2049, 0.4320) + -- ( 0.1854, 0.4539) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1717, 0.5777) + -- ( 0.1903, 0.5551) + -- ( 0.1488, 0.5210) + -- ( 0.1302, 0.5436) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1717, 0.5777) + -- ( 0.1903, 0.5551) + -- ( 0.1488, 0.5210) + -- ( 0.1302, 0.5436) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0995, 0.2545) + -- (-0.0891, 0.2819) + -- (-0.0389, 0.2629) + -- (-0.0492, 0.2355) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0995, 0.2545) + -- (-0.0891, 0.2819) + -- (-0.0389, 0.2629) + -- (-0.0492, 0.2355) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0828, 0.2371) + -- ( 0.0883, 0.2659) + -- ( 0.1411, 0.2559) + -- ( 0.1357, 0.2271) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0828, 0.2371) + -- ( 0.0883, 0.2659) + -- ( 0.1411, 0.2559) + -- ( 0.1357, 0.2271) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1049, 0.1819) + -- (-0.0945, 0.2094) + -- (-0.0443, 0.1904) + -- (-0.0546, 0.1629) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1049, 0.1819) + -- (-0.0945, 0.2094) + -- (-0.0443, 0.1904) + -- (-0.0546, 0.1629) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0889,-0.0631) + -- (-0.0785,-0.0357) + -- (-0.0283,-0.0549) + -- (-0.0388,-0.0823) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0889,-0.0631) + -- (-0.0785,-0.0357) + -- (-0.0283,-0.0549) + -- (-0.0388,-0.0823) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2282,-0.7907) + -- (-0.1823,-0.7907) + -- (-0.1823,-0.8518) + -- (-0.2282,-0.8518) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2282,-0.7907) + -- (-0.1823,-0.7907) + -- (-0.1823,-0.8518) + -- (-0.2282,-0.8518) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2275,-0.7989) + -- ( 0.2734,-0.7989) + -- ( 0.2734,-0.8599) + -- ( 0.2275,-0.8599) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2275,-0.7989) + -- ( 0.2734,-0.7989) + -- ( 0.2734,-0.8599) + -- ( 0.2275,-0.8599) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2516,-0.7126) + -- ( 0.2808,-0.7126) + -- ( 0.2808,-0.7663) + -- ( 0.2516,-0.7663) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2516,-0.7126) + -- ( 0.2808,-0.7126) + -- ( 0.2808,-0.7663) + -- ( 0.2516,-0.7663) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1669,-0.7129) + -- ( 0.1954,-0.7199) + -- ( 0.1826,-0.7721) + -- ( 0.1542,-0.7650) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1669,-0.7129) + -- ( 0.1954,-0.7199) + -- ( 0.1826,-0.7721) + -- ( 0.1542,-0.7650) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1222,-0.7854) + -- ( 0.1514,-0.7854) + -- ( 0.1514,-0.8390) + -- ( 0.1222,-0.8390) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1222,-0.7854) + -- ( 0.1514,-0.7854) + -- ( 0.1514,-0.8390) + -- ( 0.1222,-0.8390) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3031,-0.7156) + -- ( 0.3325,-0.7156) + -- ( 0.3325,-0.7693) + -- ( 0.3031,-0.7693) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3031,-0.7156) + -- ( 0.3325,-0.7156) + -- ( 0.3325,-0.7693) + -- ( 0.3031,-0.7693) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3574,-0.7174) + -- ( 0.3867,-0.7174) + -- ( 0.3867,-0.7712) + -- ( 0.3574,-0.7712) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3574,-0.7174) + -- ( 0.3867,-0.7174) + -- ( 0.3867,-0.7712) + -- ( 0.3574,-0.7712) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3742,-0.8016) + -- ( 0.4036,-0.8016) + -- ( 0.4036,-0.8554) + -- ( 0.3742,-0.8554) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3742,-0.8016) + -- ( 0.4036,-0.8016) + -- ( 0.4036,-0.8554) + -- ( 0.3742,-0.8554) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4107,-0.8072) + -- ( 0.4400,-0.8072) + -- ( 0.4400,-0.8610) + -- ( 0.4107,-0.8610) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4107,-0.8072) + -- ( 0.4400,-0.8072) + -- ( 0.4400,-0.8610) + -- ( 0.4107,-0.8610) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4612,-0.7886) + -- ( 0.4905,-0.7886) + -- ( 0.4905,-0.8423) + -- ( 0.4612,-0.8423) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4612,-0.7886) + -- ( 0.4905,-0.7886) + -- ( 0.4905,-0.8423) + -- ( 0.4612,-0.8423) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5733,-0.6570) + -- ( 0.6007,-0.6675) + -- ( 0.5814,-0.7176) + -- ( 0.5540,-0.7071) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5733,-0.6570) + -- ( 0.6007,-0.6675) + -- ( 0.5814,-0.7176) + -- ( 0.5540,-0.7071) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6698,-0.4454) + -- ( 0.6958,-0.4589) + -- ( 0.6710,-0.5065) + -- ( 0.6450,-0.4930) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6698,-0.4454) + -- ( 0.6958,-0.4589) + -- ( 0.6710,-0.5065) + -- ( 0.6450,-0.4930) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5789,-0.4658) + -- ( 0.6009,-0.4851) + -- ( 0.5654,-0.5254) + -- ( 0.5434,-0.5061) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5789,-0.4658) + -- ( 0.6009,-0.4851) + -- ( 0.5654,-0.5254) + -- ( 0.5434,-0.5061) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6025,-0.4876) + -- ( 0.6259,-0.5054) + -- ( 0.5934,-0.5481) + -- ( 0.5701,-0.5304) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6025,-0.4876) + -- ( 0.6259,-0.5054) + -- ( 0.5934,-0.5481) + -- ( 0.5701,-0.5304) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6466,-0.5044) + -- ( 0.6729,-0.5172) + -- ( 0.6493,-0.5654) + -- ( 0.6230,-0.5526) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6466,-0.5044) + -- ( 0.6729,-0.5172) + -- ( 0.6493,-0.5654) + -- ( 0.6230,-0.5526) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4854,-0.5939) + -- ( 0.5002,-0.5686) + -- ( 0.5466,-0.5955) + -- ( 0.5320,-0.6208) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4854,-0.5939) + -- ( 0.5002,-0.5686) + -- ( 0.5466,-0.5955) + -- ( 0.5320,-0.6208) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4577,-0.6299) + -- ( 0.4750,-0.6063) + -- ( 0.5183,-0.6380) + -- ( 0.5010,-0.6617) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4577,-0.6299) + -- ( 0.4750,-0.6063) + -- ( 0.5183,-0.6380) + -- ( 0.5010,-0.6617) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4354,-0.6506) + -- ( 0.4568,-0.6305) + -- ( 0.4935,-0.6697) + -- ( 0.4721,-0.6898) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4354,-0.6506) + -- ( 0.4568,-0.6305) + -- ( 0.4935,-0.6697) + -- ( 0.4721,-0.6898) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3580,-0.4631) + -- ( 0.3837,-0.4771) + -- ( 0.3581,-0.5243) + -- ( 0.3323,-0.5103) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3580,-0.4631) + -- ( 0.3837,-0.4771) + -- ( 0.3581,-0.5243) + -- ( 0.3323,-0.5103) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5131,-0.3580) + -- ( 0.5345,-0.3780) + -- ( 0.4978,-0.4172) + -- ( 0.4763,-0.3972) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5131,-0.3580) + -- ( 0.5345,-0.3780) + -- ( 0.4978,-0.4172) + -- ( 0.4763,-0.3972) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2116,-0.3904) + -- ( 0.2243,-0.3641) + -- ( 0.2726,-0.3875) + -- ( 0.2598,-0.4139) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2116,-0.3904) + -- ( 0.2243,-0.3641) + -- ( 0.2726,-0.3875) + -- ( 0.2598,-0.4139) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1786,-0.4343) + -- ( 0.1889,-0.4069) + -- ( 0.2391,-0.4259) + -- ( 0.2289,-0.4532) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1786,-0.4343) + -- ( 0.1889,-0.4069) + -- ( 0.2391,-0.4259) + -- ( 0.2289,-0.4532) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1647,-0.4763) + -- ( 0.1772,-0.4497) + -- ( 0.2258,-0.4725) + -- ( 0.2134,-0.4990) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1647,-0.4763) + -- ( 0.1772,-0.4497) + -- ( 0.2258,-0.4725) + -- ( 0.2134,-0.4990) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2335,-0.5197) + -- ( 0.2460,-0.4932) + -- ( 0.2946,-0.5160) + -- ( 0.2821,-0.5425) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2335,-0.5197) + -- ( 0.2460,-0.4932) + -- ( 0.2946,-0.5160) + -- ( 0.2821,-0.5425) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2832,-0.4218) + -- ( 0.2956,-0.3952) + -- ( 0.3443,-0.4180) + -- ( 0.3318,-0.4445) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2832,-0.4218) + -- ( 0.2956,-0.3952) + -- ( 0.3443,-0.4180) + -- ( 0.3318,-0.4445) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2064,-0.6136) + -- ( 0.2189,-0.5871) + -- ( 0.2675,-0.6099) + -- ( 0.2551,-0.6364) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2064,-0.6136) + -- ( 0.2189,-0.5871) + -- ( 0.2675,-0.6099) + -- ( 0.2551,-0.6364) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1443,-0.5195) + -- ( 0.1550,-0.4922) + -- ( 0.2050,-0.5120) + -- ( 0.1942,-0.5392) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1443,-0.5195) + -- ( 0.1550,-0.4922) + -- ( 0.2050,-0.5120) + -- ( 0.1942,-0.5392) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3128,-0.5333) + -- ( 0.3394,-0.5455) + -- ( 0.3173,-0.5943) + -- ( 0.2906,-0.5823) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3128,-0.5333) + -- ( 0.3394,-0.5455) + -- ( 0.3173,-0.5943) + -- ( 0.2906,-0.5823) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1781,-0.6526) + -- ( 0.1883,-0.6250) + -- ( 0.2386,-0.6435) + -- ( 0.2286,-0.6710) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1781,-0.6526) + -- ( 0.1883,-0.6250) + -- ( 0.2386,-0.6435) + -- ( 0.2286,-0.6710) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0147,-0.5695) + -- ( 0.0238,-0.5417) + -- ( 0.0749,-0.5582) + -- ( 0.0658,-0.5861) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0147,-0.5695) + -- ( 0.0238,-0.5417) + -- ( 0.0749,-0.5582) + -- ( 0.0658,-0.5861) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0205,-0.5124) + -- ( 0.0287,-0.4843) + -- ( 0.0803,-0.4994) + -- ( 0.0720,-0.5275) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0205,-0.5124) + -- ( 0.0287,-0.4843) + -- ( 0.0803,-0.4994) + -- ( 0.0720,-0.5275) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0719,-0.6560) + -- (-0.0678,-0.6849) + -- (-0.1209,-0.6925) + -- (-0.1250,-0.6635) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0719,-0.6560) + -- (-0.0678,-0.6849) + -- (-0.1209,-0.6925) + -- (-0.1250,-0.6635) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1330,-0.6411) + -- (-0.1375,-0.6700) + -- (-0.1906,-0.6618) + -- (-0.1861,-0.6329) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1330,-0.6411) + -- (-0.1375,-0.6700) + -- (-0.1906,-0.6618) + -- (-0.1861,-0.6329) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0334,-0.7381) + -- (-0.0042,-0.7381) + -- (-0.0042,-0.7917) + -- (-0.0334,-0.7917) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0334,-0.7381) + -- (-0.0042,-0.7381) + -- (-0.0042,-0.7917) + -- (-0.0334,-0.7917) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0998,-0.7315) + -- (-0.0706,-0.7315) + -- (-0.0706,-0.7852) + -- (-0.0998,-0.7852) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0998,-0.7315) + -- (-0.0706,-0.7315) + -- (-0.0706,-0.7852) + -- (-0.0998,-0.7852) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2018,-0.7234) + -- (-0.1730,-0.7180) + -- (-0.1631,-0.7708) + -- (-0.1919,-0.7762) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2018,-0.7234) + -- (-0.1730,-0.7180) + -- (-0.1631,-0.7708) + -- (-0.1919,-0.7762) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2956,-0.7184) + -- (-0.2667,-0.7229) + -- (-0.2750,-0.7760) + -- (-0.3039,-0.7714) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2956,-0.7184) + -- (-0.2667,-0.7229) + -- (-0.2750,-0.7760) + -- (-0.3039,-0.7714) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1661,-0.8014) + -- (-0.1372,-0.8060) + -- (-0.1454,-0.8590) + -- (-0.1744,-0.8545) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1661,-0.8014) + -- (-0.1372,-0.8060) + -- (-0.1454,-0.8590) + -- (-0.1744,-0.8545) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1269,-0.8074) + -- (-0.0977,-0.8054) + -- (-0.0940,-0.8590) + -- (-0.1232,-0.8610) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1269,-0.8074) + -- (-0.0977,-0.8054) + -- (-0.0940,-0.8590) + -- (-0.1232,-0.8610) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2787,-0.7975) + -- (-0.2495,-0.7956) + -- (-0.2459,-0.8492) + -- (-0.2751,-0.8511) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2787,-0.7975) + -- (-0.2495,-0.7956) + -- (-0.2459,-0.8492) + -- (-0.2751,-0.8511) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3966,-0.5592) + -- (-0.3802,-0.5834) + -- (-0.4246,-0.6135) + -- (-0.4411,-0.5892) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3966,-0.5592) + -- (-0.3802,-0.5834) + -- (-0.4246,-0.6135) + -- (-0.4411,-0.5892) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4189,-0.5000) + -- (-0.4033,-0.5248) + -- (-0.4488,-0.5534) + -- (-0.4644,-0.5286) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4189,-0.5000) + -- (-0.4033,-0.5248) + -- (-0.4488,-0.5534) + -- (-0.4644,-0.5286) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3561,-0.4332) + -- (-0.3310,-0.4483) + -- (-0.3586,-0.4944) + -- (-0.3837,-0.4793) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3561,-0.4332) + -- (-0.3310,-0.4483) + -- (-0.3586,-0.4944) + -- (-0.3837,-0.4793) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3120,-0.4787) + -- (-0.2896,-0.4976) + -- (-0.3241,-0.5386) + -- (-0.3466,-0.5198) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3120,-0.4787) + -- (-0.2896,-0.4976) + -- (-0.3241,-0.5386) + -- (-0.3466,-0.5198) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2660,-0.5113) + -- (-0.2456,-0.5323) + -- (-0.2840,-0.5697) + -- (-0.3045,-0.5487) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2660,-0.5113) + -- (-0.2456,-0.5323) + -- (-0.2840,-0.5697) + -- (-0.3045,-0.5487) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3939,-0.2212) + -- (-0.3666,-0.2319) + -- (-0.3863,-0.2819) + -- (-0.4135,-0.2712) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3939,-0.2212) + -- (-0.3666,-0.2319) + -- (-0.3863,-0.2819) + -- (-0.4135,-0.2712) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3038,-0.2403) + -- (-0.2765,-0.2509) + -- (-0.2961,-0.3010) + -- (-0.3234,-0.2902) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3038,-0.2403) + -- (-0.2765,-0.2509) + -- (-0.2961,-0.3010) + -- (-0.3234,-0.2902) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3532,-0.2251) + -- (-0.3255,-0.2346) + -- (-0.3428,-0.2854) + -- (-0.3705,-0.2760) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3532,-0.2251) + -- (-0.3255,-0.2346) + -- (-0.3428,-0.2854) + -- (-0.3705,-0.2760) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3482,-0.3198) + -- (-0.3204,-0.3293) + -- (-0.3377,-0.3801) + -- (-0.3655,-0.3706) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3482,-0.3198) + -- (-0.3204,-0.3293) + -- (-0.3377,-0.3801) + -- (-0.3655,-0.3706) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5006,-0.1767) + -- (-0.4737,-0.1885) + -- (-0.4953,-0.2376) + -- (-0.5221,-0.2258) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5006,-0.1767) + -- (-0.4737,-0.1885) + -- (-0.4953,-0.2376) + -- (-0.5221,-0.2258) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5739,-0.2312) + -- (-0.5595,-0.2568) + -- (-0.6065,-0.2830) + -- (-0.6207,-0.2575) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5739,-0.2312) + -- (-0.5595,-0.2568) + -- (-0.6065,-0.2830) + -- (-0.6207,-0.2575) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5929,-0.3943) + -- (-0.5696,-0.3765) + -- (-0.5369,-0.4192) + -- (-0.5602,-0.4370) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5929,-0.3943) + -- (-0.5696,-0.3765) + -- (-0.5369,-0.4192) + -- (-0.5602,-0.4370) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5005,-0.3312) + -- (-0.4775,-0.3129) + -- (-0.4441,-0.3550) + -- (-0.4670,-0.3733) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5005,-0.3312) + -- (-0.4775,-0.3129) + -- (-0.4441,-0.3550) + -- (-0.4670,-0.3733) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5523,-0.3618) + -- (-0.5293,-0.3436) + -- (-0.4960,-0.3857) + -- (-0.5189,-0.4038) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5523,-0.3618) + -- (-0.5293,-0.3436) + -- (-0.4960,-0.3857) + -- (-0.5189,-0.4038) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4383,-0.3880) + -- (-0.4249,-0.4140) + -- (-0.4726,-0.4386) + -- (-0.4861,-0.4126) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4383,-0.3880) + -- (-0.4249,-0.4140) + -- (-0.4726,-0.4386) + -- (-0.4861,-0.4126) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6626,-0.4293) + -- (-0.6510,-0.4562) + -- (-0.7003,-0.4775) + -- (-0.7119,-0.4506) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6626,-0.4293) + -- (-0.6510,-0.4562) + -- (-0.7003,-0.4775) + -- (-0.7119,-0.4506) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6449,-0.4759) + -- (-0.6280,-0.4998) + -- (-0.6717,-0.5309) + -- (-0.6887,-0.5069) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6449,-0.4759) + -- (-0.6280,-0.4998) + -- (-0.6717,-0.5309) + -- (-0.6887,-0.5069) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5766,-0.5683) + -- (-0.5643,-0.5948) + -- (-0.6130,-0.6174) + -- (-0.6254,-0.5909) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5766,-0.5683) + -- (-0.5643,-0.5948) + -- (-0.6130,-0.6174) + -- (-0.6254,-0.5909) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4733,-0.5728) + -- (-0.4590,-0.5983) + -- (-0.5061,-0.6244) + -- (-0.5202,-0.5988) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4733,-0.5728) + -- (-0.4590,-0.5983) + -- (-0.5061,-0.6244) + -- (-0.5202,-0.5988) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4272,-0.6520) + -- (-0.4128,-0.6774) + -- (-0.4595,-0.7039) + -- (-0.4740,-0.6785) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4272,-0.6520) + -- (-0.4128,-0.6774) + -- (-0.4595,-0.7039) + -- (-0.4740,-0.6785) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5374,-0.6782) + -- (-0.5236,-0.7040) + -- (-0.5710,-0.7292) + -- (-0.5848,-0.7034) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5374,-0.6782) + -- (-0.5236,-0.7040) + -- (-0.5710,-0.7292) + -- (-0.5848,-0.7034) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5214,-0.7131) + -- (-0.5038,-0.7365) + -- (-0.5468,-0.7687) + -- (-0.5644,-0.7453) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5214,-0.7131) + -- (-0.5038,-0.7365) + -- (-0.5468,-0.7687) + -- (-0.5644,-0.7453) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2847,-0.1917) + -- ( 0.2954,-0.1644) + -- ( 0.3454,-0.1841) + -- ( 0.3347,-0.2114) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2847,-0.1917) + -- ( 0.2954,-0.1644) + -- ( 0.3454,-0.1841) + -- ( 0.3347,-0.2114) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2692,-0.2397) + -- ( 0.2775,-0.2116) + -- ( 0.3291,-0.2268) + -- ( 0.3208,-0.2548) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2692,-0.2397) + -- ( 0.2775,-0.2116) + -- ( 0.3291,-0.2268) + -- ( 0.3208,-0.2548) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2587,-0.2944) + -- ( 0.2585,-0.2651) + -- ( 0.3123,-0.2648) + -- ( 0.3125,-0.2941) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2587,-0.2944) + -- ( 0.2585,-0.2651) + -- ( 0.3123,-0.2648) + -- ( 0.3125,-0.2941) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1269,-0.2581) + -- ( 0.1359,-0.2303) + -- ( 0.1871,-0.2468) + -- ( 0.1780,-0.2746) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1269,-0.2581) + -- ( 0.1359,-0.2303) + -- ( 0.1871,-0.2468) + -- ( 0.1780,-0.2746) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1127,-0.3153) + -- ( 0.1232,-0.2880) + -- ( 0.1733,-0.3074) + -- ( 0.1626,-0.3348) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1127,-0.3153) + -- ( 0.1232,-0.2880) + -- ( 0.1733,-0.3074) + -- ( 0.1626,-0.3348) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1928,-0.0951) + -- ( 0.2055,-0.0687) + -- ( 0.2539,-0.0920) + -- ( 0.2412,-0.1184) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1928,-0.0951) + -- ( 0.2055,-0.0687) + -- ( 0.2539,-0.0920) + -- ( 0.2412,-0.1184) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2202,-0.0375) + -- ( 0.2335,-0.0113) + -- ( 0.2814,-0.0356) + -- ( 0.2682,-0.0617) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2202,-0.0375) + -- ( 0.2335,-0.0113) + -- ( 0.2814,-0.0356) + -- ( 0.2682,-0.0617) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2582, 0.0509) + -- ( 0.2736, 0.0259) + -- ( 0.2278,-0.0022) + -- ( 0.2125, 0.0227) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2582, 0.0509) + -- ( 0.2736, 0.0259) + -- ( 0.2278,-0.0022) + -- ( 0.2125, 0.0227) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2111, 0.0849) + -- ( 0.2307, 0.0632) + -- ( 0.1908, 0.0273) + -- ( 0.1712, 0.0490) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2111, 0.0849) + -- ( 0.2307, 0.0632) + -- ( 0.1908, 0.0273) + -- ( 0.1712, 0.0490) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1776, 0.1187) + -- ( 0.1982, 0.0978) + -- ( 0.1599, 0.0601) + -- ( 0.1394, 0.0810) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1776, 0.1187) + -- ( 0.1982, 0.0978) + -- ( 0.1599, 0.0601) + -- ( 0.1394, 0.0810) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2760, 0.3987) + -- ( 0.2946, 0.3760) + -- ( 0.2531, 0.3420) + -- ( 0.2345, 0.3646) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2760, 0.3987) + -- ( 0.2946, 0.3760) + -- ( 0.2531, 0.3420) + -- ( 0.2345, 0.3646) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3226, 0.3543) + -- ( 0.3420, 0.3323) + -- ( 0.3018, 0.2967) + -- ( 0.2824, 0.3185) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3226, 0.3543) + -- ( 0.3420, 0.3323) + -- ( 0.3018, 0.2967) + -- ( 0.2824, 0.3185) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2277, 0.3599) + -- (-0.2171, 0.3872) + -- (-0.1671, 0.3676) + -- (-0.1777, 0.3404) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2277, 0.3599) + -- (-0.2171, 0.3872) + -- (-0.1671, 0.3676) + -- (-0.1777, 0.3404) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1722, 0.5368) + -- (-0.1616, 0.5642) + -- (-0.1116, 0.5446) + -- (-0.1223, 0.5174) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1722, 0.5368) + -- (-0.1616, 0.5642) + -- (-0.1116, 0.5446) + -- (-0.1223, 0.5174) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2400, 0.3081) + -- (-0.2307, 0.3359) + -- (-0.1797, 0.3189) + -- (-0.1890, 0.2912) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2400, 0.3081) + -- (-0.2307, 0.3359) + -- (-0.1797, 0.3189) + -- (-0.1890, 0.2912) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2735, 0.1997) + -- (-0.2631, 0.2270) + -- (-0.2129, 0.2080) + -- (-0.2233, 0.1807) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2735, 0.1997) + -- (-0.2631, 0.2270) + -- (-0.2129, 0.2080) + -- (-0.2233, 0.1807) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3047, 0.1045) + -- (-0.2975, 0.1329) + -- (-0.2455, 0.1200) + -- (-0.2525, 0.0915) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3047, 0.1045) + -- (-0.2975, 0.1329) + -- (-0.2455, 0.1200) + -- (-0.2525, 0.0915) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1406, 0.3596) + -- (-0.1136, 0.3482) + -- (-0.1345, 0.2988) + -- (-0.1615, 0.3102) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1406, 0.3596) + -- (-0.1136, 0.3482) + -- (-0.1345, 0.2988) + -- (-0.1615, 0.3102) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0597, 0.5878) + -- (-0.0327, 0.5763) + -- (-0.0536, 0.5269) + -- (-0.0806, 0.5383) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0597, 0.5878) + -- (-0.0327, 0.5763) + -- (-0.0536, 0.5269) + -- (-0.0806, 0.5383) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0206, 0.5864) + -- ( 0.0064, 0.5749) + -- (-0.0146, 0.5255) + -- (-0.0416, 0.5369) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0206, 0.5864) + -- ( 0.0064, 0.5749) + -- (-0.0146, 0.5255) + -- (-0.0416, 0.5369) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1653, 0.2738) + -- (-0.1360, 0.2738) + -- (-0.1360, 0.2200) + -- (-0.1653, 0.2200) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1653, 0.2738) + -- (-0.1360, 0.2738) + -- (-0.1360, 0.2200) + -- (-0.1653, 0.2200) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1782, 0.2207) + -- (-0.1501, 0.2122) + -- (-0.1657, 0.1608) + -- (-0.1937, 0.1693) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1782, 0.2207) + -- (-0.1501, 0.2122) + -- (-0.1657, 0.1608) + -- (-0.1937, 0.1693) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2343, 0.0622) + -- (-0.2239, 0.0896) + -- (-0.1737, 0.0706) + -- (-0.1840, 0.0432) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2343, 0.0622) + -- (-0.2239, 0.0896) + -- (-0.1737, 0.0706) + -- (-0.1840, 0.0432) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1289, 0.0933) + -- (-0.1186, 0.1207) + -- (-0.0683, 0.1017) + -- (-0.0787, 0.0743) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1289, 0.0933) + -- (-0.1186, 0.1207) + -- (-0.0683, 0.1017) + -- (-0.0787, 0.0743) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2223, 0.7399) + -- ( 0.2483, 0.7532) + -- ( 0.2727, 0.7054) + -- ( 0.2467, 0.6920) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2223, 0.7399) + -- ( 0.2483, 0.7532) + -- ( 0.2727, 0.7054) + -- ( 0.2467, 0.6920) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5440, 0.7476) + -- ( 0.5576, 0.7217) + -- ( 0.5102, 0.6965) + -- ( 0.4965, 0.7224) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5440, 0.7476) + -- ( 0.5576, 0.7217) + -- ( 0.5102, 0.6965) + -- ( 0.4965, 0.7224) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5919, 0.6377) + -- ( 0.6068, 0.6125) + -- ( 0.5604, 0.5853) + -- ( 0.5456, 0.6106) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5919, 0.6377) + -- ( 0.6068, 0.6125) + -- ( 0.5604, 0.5853) + -- ( 0.5456, 0.6106) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6224, 0.5979) + -- ( 0.6382, 0.5732) + -- ( 0.5930, 0.5443) + -- ( 0.5772, 0.5690) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6224, 0.5979) + -- ( 0.6382, 0.5732) + -- ( 0.5930, 0.5443) + -- ( 0.5772, 0.5690) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4104, 0.6743) + -- ( 0.4255, 0.6491) + -- ( 0.3795, 0.6215) + -- ( 0.3644, 0.6466) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4104, 0.6743) + -- ( 0.4255, 0.6491) + -- ( 0.3795, 0.6215) + -- ( 0.3644, 0.6466) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4437, 0.6203) + -- ( 0.4592, 0.5954) + -- ( 0.4136, 0.5671) + -- ( 0.3981, 0.5918) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4437, 0.6203) + -- ( 0.4592, 0.5954) + -- ( 0.4136, 0.5671) + -- ( 0.3981, 0.5918) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5275, 0.4892) + -- ( 0.5449, 0.4656) + -- ( 0.5018, 0.4337) + -- ( 0.4844, 0.4571) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5275, 0.4892) + -- ( 0.5449, 0.4656) + -- ( 0.5018, 0.4337) + -- ( 0.4844, 0.4571) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2900, 0.6234) + -- ( 0.3087, 0.6008) + -- ( 0.2671, 0.5666) + -- ( 0.2485, 0.5892) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2900, 0.6234) + -- ( 0.3087, 0.6008) + -- ( 0.2671, 0.5666) + -- ( 0.2485, 0.5892) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3295, 0.5855) + -- ( 0.3477, 0.5626) + -- ( 0.3058, 0.5291) + -- ( 0.2875, 0.5519) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3295, 0.5855) + -- ( 0.3477, 0.5626) + -- ( 0.3058, 0.5291) + -- ( 0.2875, 0.5519) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3915, 0.5035) + -- ( 0.4098, 0.4807) + -- ( 0.3680, 0.4471) + -- ( 0.3497, 0.4699) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3915, 0.5035) + -- ( 0.4098, 0.4807) + -- ( 0.3680, 0.4471) + -- ( 0.3497, 0.4699) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4274, 0.4691) + -- ( 0.4472, 0.4474) + -- ( 0.4075, 0.4112) + -- ( 0.3878, 0.4327) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4274, 0.4691) + -- ( 0.4472, 0.4474) + -- ( 0.4075, 0.4112) + -- ( 0.3878, 0.4327) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0465, 0.7243) + -- ( 0.0751, 0.7305) + -- ( 0.0864, 0.6779) + -- ( 0.0578, 0.6717) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0465, 0.7243) + -- ( 0.0751, 0.7305) + -- ( 0.0864, 0.6779) + -- ( 0.0578, 0.6717) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0312, 0.7116) + -- (-0.0338, 0.7407) + -- ( 0.0197, 0.7456) + -- ( 0.0223, 0.7164) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0312, 0.7116) + -- (-0.0338, 0.7407) + -- ( 0.0197, 0.7456) + -- ( 0.0223, 0.7164) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1044, 0.7143) + -- (-0.1084, 0.7434) + -- (-0.0552, 0.7507) + -- (-0.0512, 0.7216) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1044, 0.7143) + -- (-0.1084, 0.7434) + -- (-0.0552, 0.7507) + -- (-0.0512, 0.7216) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1250, 0.6753) + -- (-0.1169, 0.7034) + -- (-0.0653, 0.6887) + -- (-0.0733, 0.6605) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1250, 0.6753) + -- (-0.1169, 0.7034) + -- (-0.0653, 0.6887) + -- (-0.0733, 0.6605) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2293, 0.7263) + -- (-0.2016, 0.7170) + -- (-0.2185, 0.6660) + -- (-0.2463, 0.6753) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2293, 0.7263) + -- (-0.2016, 0.7170) + -- (-0.2185, 0.6660) + -- (-0.2463, 0.6753) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4164, 0.8019) + -- (-0.3886, 0.7926) + -- (-0.4056, 0.7417) + -- (-0.4335, 0.7510) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4164, 0.8019) + -- (-0.3886, 0.7926) + -- (-0.4056, 0.7417) + -- (-0.4335, 0.7510) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3769, 0.7827) + -- (-0.3486, 0.7746) + -- (-0.3636, 0.7230) + -- (-0.3918, 0.7311) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3769, 0.7827) + -- (-0.3486, 0.7746) + -- (-0.3636, 0.7230) + -- (-0.3918, 0.7311) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2690, 0.8085) + -- (-0.2696, 0.8379) + -- (-0.2159, 0.8389) + -- (-0.2153, 0.8097) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2690, 0.8085) + -- (-0.2696, 0.8379) + -- (-0.2159, 0.8389) + -- (-0.2153, 0.8097) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0864, 0.8532) + -- (-0.0767, 0.8256) + -- (-0.1273, 0.8076) + -- (-0.1371, 0.8352) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0864, 0.8532) + -- (-0.0767, 0.8256) + -- (-0.1273, 0.8076) + -- (-0.1371, 0.8352) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3699, 0.6041) + -- (-0.3425, 0.5939) + -- (-0.3609, 0.5436) + -- (-0.3885, 0.5537) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3699, 0.6041) + -- (-0.3425, 0.5939) + -- (-0.3609, 0.5436) + -- (-0.3885, 0.5537) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4770, 0.6412) + -- (-0.4500, 0.6299) + -- (-0.4707, 0.5804) + -- (-0.4978, 0.5918) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4770, 0.6412) + -- (-0.4500, 0.6299) + -- (-0.4707, 0.5804) + -- (-0.4978, 0.5918) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4348, 0.4860) + -- (-0.4060, 0.4806) + -- (-0.4159, 0.4278) + -- (-0.4447, 0.4332) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4348, 0.4860) + -- (-0.4060, 0.4806) + -- (-0.4159, 0.4278) + -- (-0.4447, 0.4332) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4771, 0.4952) + -- (-0.4520, 0.4800) + -- (-0.4799, 0.4341) + -- (-0.5050, 0.4493) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4771, 0.4952) + -- (-0.4520, 0.4800) + -- (-0.4799, 0.4341) + -- (-0.5050, 0.4493) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5175, 0.4232) + -- (-0.4917, 0.4092) + -- (-0.5176, 0.3620) + -- (-0.5433, 0.3761) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5175, 0.4232) + -- (-0.4917, 0.4092) + -- (-0.5176, 0.3620) + -- (-0.5433, 0.3761) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5739, 0.5614) + -- (-0.5487, 0.5464) + -- (-0.5762, 0.5003) + -- (-0.6013, 0.5152) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5739, 0.5614) + -- (-0.5487, 0.5464) + -- (-0.5762, 0.5003) + -- (-0.6013, 0.5152) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6244, 0.4780) + -- (-0.5977, 0.4661) + -- (-0.6195, 0.4170) + -- (-0.6463, 0.4289) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6244, 0.4780) + -- (-0.5977, 0.4661) + -- (-0.6195, 0.4170) + -- (-0.6463, 0.4289) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6236, 0.1401) + -- (-0.6192, 0.1691) + -- (-0.5661, 0.1611) + -- (-0.5705, 0.1321) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6236, 0.1401) + -- (-0.6192, 0.1691) + -- (-0.5661, 0.1611) + -- (-0.5705, 0.1321) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3872, 0.3590) + -- (-0.3829, 0.3880) + -- (-0.3297, 0.3800) + -- (-0.3341, 0.3510) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3872, 0.3590) + -- (-0.3829, 0.3880) + -- (-0.3297, 0.3800) + -- (-0.3341, 0.3510) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6525, 0.1021) + -- (-0.6404, 0.1288) + -- (-0.5915, 0.1066) + -- (-0.6036, 0.0799) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6525, 0.1021) + -- (-0.6404, 0.1288) + -- (-0.5915, 0.1066) + -- (-0.6036, 0.0799) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4323, 0.3237) + -- (-0.4202, 0.3503) + -- (-0.3713, 0.3280) + -- (-0.3834, 0.3014) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4323, 0.3237) + -- (-0.4202, 0.3503) + -- (-0.3713, 0.3280) + -- (-0.3834, 0.3014) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3470, 0.2846) + -- (-0.3349, 0.3113) + -- (-0.2859, 0.2891) + -- (-0.2981, 0.2624) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3470, 0.2846) + -- (-0.3349, 0.3113) + -- (-0.2859, 0.2891) + -- (-0.2981, 0.2624) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3053, 0.3741) + -- (-0.2932, 0.4008) + -- (-0.2443, 0.3786) + -- (-0.2564, 0.3519) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3053, 0.3741) + -- (-0.2932, 0.4008) + -- (-0.2443, 0.3786) + -- (-0.2564, 0.3519) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6751, 0.0465) + -- (-0.6666, 0.0746) + -- (-0.6152, 0.0590) + -- (-0.6237, 0.0310) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6751, 0.0465) + -- (-0.6666, 0.0746) + -- (-0.6152, 0.0590) + -- (-0.6237, 0.0310) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.7316,-0.0595) + -- (-0.7215,-0.0320) + -- (-0.6711,-0.0505) + -- (-0.6812,-0.0780) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.7316,-0.0595) + -- (-0.7215,-0.0320) + -- (-0.6711,-0.0505) + -- (-0.6812,-0.0780) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.7748,-0.1355) + -- (-0.7629,-0.1088) + -- (-0.7138,-0.1305) + -- (-0.7257,-0.1573) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.7748,-0.1355) + -- (-0.7629,-0.1088) + -- (-0.7138,-0.1305) + -- (-0.7257,-0.1573) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6698,-0.1385) + -- (-0.6512,-0.1159) + -- (-0.6098,-0.1501) + -- (-0.6284,-0.1727) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6698,-0.1385) + -- (-0.6512,-0.1159) + -- (-0.6098,-0.1501) + -- (-0.6284,-0.1727) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3325,-0.1175) + -- (-0.3067,-0.1313) + -- (-0.3320,-0.1787) + -- (-0.3579,-0.1649) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3325,-0.1175) + -- (-0.3067,-0.1313) + -- (-0.3320,-0.1787) + -- (-0.3579,-0.1649) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4097,-0.0630) + -- (-0.3827,-0.0741) + -- (-0.4031,-0.1238) + -- (-0.4302,-0.1127) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4097,-0.0630) + -- (-0.3827,-0.0741) + -- (-0.4031,-0.1238) + -- (-0.4302,-0.1127) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3028, 0.0016) + -- (-0.2734, 0.0016) + -- (-0.2734,-0.0522) + -- (-0.3028,-0.0522) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3028, 0.0016) + -- (-0.2734, 0.0016) + -- (-0.2734,-0.0522) + -- (-0.3028,-0.0522) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2492,-0.0037) + -- (-0.2198,-0.0037) + -- (-0.2198,-0.0574) + -- (-0.2492,-0.0574) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2492,-0.0037) + -- (-0.2198,-0.0037) + -- (-0.2198,-0.0574) + -- (-0.2492,-0.0574) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4151, 0.0294) + -- (-0.3858, 0.0294) + -- (-0.3858,-0.0243) + -- (-0.4151,-0.0243) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4151, 0.0294) + -- (-0.3858, 0.0294) + -- (-0.3858,-0.0243) + -- (-0.4151,-0.0243) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4687, 0.0340) + -- (-0.4394, 0.0340) + -- (-0.4394,-0.0197) + -- (-0.4687,-0.0197) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4687, 0.0340) + -- (-0.4394, 0.0340) + -- (-0.4394,-0.0197) + -- (-0.4687,-0.0197) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5170, 0.0545) + -- (-0.4876, 0.0545) + -- (-0.4876, 0.0008) + -- (-0.5170, 0.0008) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5170, 0.0545) + -- (-0.4876, 0.0545) + -- (-0.4876, 0.0008) + -- (-0.5170, 0.0008) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4695, 0.1540) + -- (-0.4413, 0.1461) + -- (-0.4557, 0.0943) + -- (-0.4839, 0.1022) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4695, 0.1540) + -- (-0.4413, 0.1461) + -- (-0.4557, 0.0943) + -- (-0.4839, 0.1022) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4511, 0.2320) + -- (-0.4227, 0.2241) + -- (-0.4372, 0.1724) + -- (-0.4654, 0.1803) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4511, 0.2320) + -- (-0.4227, 0.2241) + -- (-0.4372, 0.1724) + -- (-0.4654, 0.1803) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4191, 0.1396) + -- (-0.3904, 0.1335) + -- (-0.4017, 0.0809) + -- (-0.4304, 0.0871) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4191, 0.1396) + -- (-0.3904, 0.1335) + -- (-0.4017, 0.0809) + -- (-0.4304, 0.0871) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0048,-0.2963) + -- ( 0.0056,-0.2689) + -- ( 0.0558,-0.2881) + -- ( 0.0453,-0.3155) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0048,-0.2963) + -- ( 0.0056,-0.2689) + -- ( 0.0558,-0.2881) + -- ( 0.0453,-0.3155) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0804,-0.1001) + -- ( 0.0908,-0.0728) + -- ( 0.1410,-0.0919) + -- ( 0.1305,-0.1192) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0804,-0.1001) + -- ( 0.0908,-0.0728) + -- ( 0.1410,-0.0919) + -- ( 0.1305,-0.1192) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1027,-0.2588) + -- (-0.0979,-0.2299) + -- (-0.0449,-0.2387) + -- (-0.0498,-0.2676) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1027,-0.2588) + -- (-0.0979,-0.2299) + -- (-0.0449,-0.2387) + -- (-0.0498,-0.2676) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1889,-0.2314) + -- (-0.1776,-0.2043) + -- (-0.1281,-0.2251) + -- (-0.1394,-0.2521) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1889,-0.2314) + -- (-0.1776,-0.2043) + -- (-0.1281,-0.2251) + -- (-0.1394,-0.2521) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1180,-0.3033) + -- (-0.1077,-0.2759) + -- (-0.0575,-0.2947) + -- (-0.0677,-0.3221) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1180,-0.3033) + -- (-0.1077,-0.2759) + -- (-0.0575,-0.2947) + -- (-0.0677,-0.3221) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2120,-0.2801) + -- (-0.2010,-0.2529) + -- (-0.1512,-0.2729) + -- (-0.1622,-0.3002) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2120,-0.2801) + -- (-0.2010,-0.2529) + -- (-0.1512,-0.2729) + -- (-0.1622,-0.3002) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2265,-0.3343) + -- (-0.2161,-0.3069) + -- (-0.1659,-0.3259) + -- (-0.1762,-0.3533) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2265,-0.3343) + -- (-0.2161,-0.3069) + -- (-0.1659,-0.3259) + -- (-0.1762,-0.3533) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0728,-0.3520) + -- (-0.0436,-0.3488) + -- (-0.0379,-0.4022) + -- (-0.0670,-0.4054) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0728,-0.3520) + -- (-0.0436,-0.3488) + -- (-0.0379,-0.4022) + -- (-0.0670,-0.4054) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3598,-0.6299) + -- ( 0.3752,-0.6051) + -- ( 0.4209,-0.6334) + -- ( 0.4054,-0.6583) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3598,-0.6299) + -- ( 0.3752,-0.6051) + -- ( 0.4209,-0.6334) + -- ( 0.4054,-0.6583) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3284,-0.6582) + -- ( 0.3482,-0.6365) + -- ( 0.3879,-0.6727) + -- ( 0.3681,-0.6944) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3284,-0.6582) + -- ( 0.3482,-0.6365) + -- ( 0.3879,-0.6727) + -- ( 0.3681,-0.6944) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.8159,-0.3188) + -- (-0.7892,-0.3067) + -- (-0.7670,-0.3556) + -- (-0.7937,-0.3677) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.8159,-0.3188) + -- (-0.7892,-0.3067) + -- (-0.7670,-0.3556) + -- (-0.7937,-0.3677) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.8755, 0.1805) + -- (-0.8623, 0.2066) + -- (-0.8144, 0.1824) + -- (-0.8276, 0.1562) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.8755, 0.1805) + -- (-0.8623, 0.2066) + -- (-0.8144, 0.1824) + -- (-0.8276, 0.1562) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.9400, 0.0507) + -- (-0.9275, 0.0771) + -- (-0.8789, 0.0541) + -- (-0.8916, 0.0276) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.9400, 0.0507) + -- (-0.9275, 0.0771) + -- (-0.8789, 0.0541) + -- (-0.8916, 0.0276) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.9500,-0.0171) + -- (-0.9467, 0.0120) + -- (-0.8934, 0.0060) + -- (-0.8966,-0.0232) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.9500,-0.0171) + -- (-0.9467, 0.0120) + -- (-0.8934, 0.0060) + -- (-0.8966,-0.0232) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0374, 0.6594) + -- (-0.0376, 0.6887) + -- ( 0.0161, 0.6890) + -- ( 0.0162, 0.6598) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0374, 0.6594) + -- (-0.0376, 0.6887) + -- ( 0.0161, 0.6890) + -- ( 0.0162, 0.6598) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1600, 0.8267) + -- ( 0.1793, 0.8046) + -- ( 0.1388, 0.7692) + -- ( 0.1195, 0.7913) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1600, 0.8267) + -- ( 0.1793, 0.8046) + -- ( 0.1388, 0.7692) + -- ( 0.1195, 0.7913) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4284, 0.3107) + -- ( 0.4572, 0.3163) + -- ( 0.4672, 0.2634) + -- ( 0.4384, 0.2580) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4284, 0.3107) + -- ( 0.4572, 0.3163) + -- ( 0.4672, 0.2634) + -- ( 0.4384, 0.2580) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4721, 0.3149) + -- ( 0.5003, 0.3230) + -- ( 0.5151, 0.2714) + -- ( 0.4870, 0.2633) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4721, 0.3149) + -- ( 0.5003, 0.3230) + -- ( 0.5151, 0.2714) + -- ( 0.4870, 0.2633) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5761, 0.3388) + -- ( 0.6049, 0.3443) + -- ( 0.6150, 0.2916) + -- ( 0.5862, 0.2860) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5761, 0.3388) + -- ( 0.6049, 0.3443) + -- ( 0.6150, 0.2916) + -- ( 0.5862, 0.2860) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6283, 0.3369) + -- ( 0.6567, 0.3296) + -- ( 0.6432, 0.2775) + -- ( 0.6148, 0.2849) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6283, 0.3369) + -- ( 0.6567, 0.3296) + -- ( 0.6432, 0.2775) + -- ( 0.6148, 0.2849) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5378, 0.2581) + -- ( 0.5670, 0.2616) + -- ( 0.5734, 0.2083) + -- ( 0.5443, 0.2047) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5378, 0.2581) + -- ( 0.5670, 0.2616) + -- ( 0.5734, 0.2083) + -- ( 0.5443, 0.2047) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4853, 0.2500) + -- ( 0.5140, 0.2555) + -- ( 0.5241, 0.2028) + -- ( 0.4953, 0.1973) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4853, 0.2500) + -- ( 0.5140, 0.2555) + -- ( 0.5241, 0.2028) + -- ( 0.4953, 0.1973) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4028, 0.0895) + -- ( 0.4321, 0.0895) + -- ( 0.4321, 0.0358) + -- ( 0.4028, 0.0358) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4028, 0.0895) + -- ( 0.4321, 0.0895) + -- ( 0.4321, 0.0358) + -- ( 0.4028, 0.0358) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4612, 0.0957) + -- ( 0.4899, 0.0898) + -- ( 0.4793, 0.0371) + -- ( 0.4506, 0.0430) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4612, 0.0957) + -- ( 0.4899, 0.0898) + -- ( 0.4793, 0.0371) + -- ( 0.4506, 0.0430) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5422,-0.0041) + -- ( 0.5437,-0.0333) + -- ( 0.4900,-0.0361) + -- ( 0.4885,-0.0068) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5422,-0.0041) + -- ( 0.5437,-0.0333) + -- ( 0.4900,-0.0361) + -- ( 0.4885,-0.0068) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6654,-0.0050) + -- ( 0.6664,-0.0343) + -- ( 0.6128,-0.0361) + -- ( 0.6117,-0.0068) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6654,-0.0050) + -- ( 0.6664,-0.0343) + -- ( 0.6128,-0.0361) + -- ( 0.6117,-0.0068) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.7573, 0.2817) + -- ( 0.7646, 0.2533) + -- ( 0.7124, 0.2402) + -- ( 0.7053, 0.2686) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.7573, 0.2817) + -- ( 0.7646, 0.2533) + -- ( 0.7124, 0.2402) + -- ( 0.7053, 0.2686) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.7393, 0.3502) + -- ( 0.7456, 0.3216) + -- ( 0.6931, 0.3101) + -- ( 0.6868, 0.3387) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.7393, 0.3502) + -- ( 0.7456, 0.3216) + -- ( 0.6931, 0.3101) + -- ( 0.6868, 0.3387) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.8114, 0.0963) + -- ( 0.8188, 0.0679) + -- ( 0.7668, 0.0543) + -- ( 0.7594, 0.0826) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.8114, 0.0963) + -- ( 0.8188, 0.0679) + -- ( 0.7668, 0.0543) + -- ( 0.7594, 0.0826) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.8247,-0.0115) + -- ( 0.8312,-0.0401) + -- ( 0.7788,-0.0521) + -- ( 0.7723,-0.0235) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.8247,-0.0115) + -- ( 0.8312,-0.0401) + -- ( 0.7788,-0.0521) + -- ( 0.7723,-0.0235) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.9279, 0.0392) + -- ( 0.9358, 0.0110) + -- ( 0.8842,-0.0036) + -- ( 0.8762, 0.0245) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.9279, 0.0392) + -- ( 0.9358, 0.0110) + -- ( 0.8842,-0.0036) + -- ( 0.8762, 0.0245) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.9473,-0.0199) + -- ( 0.9500,-0.0490) + -- ( 0.8965,-0.0540) + -- ( 0.8939,-0.0248) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.9473,-0.0199) + -- ( 0.9500,-0.0490) + -- ( 0.8965,-0.0540) + -- ( 0.8939,-0.0248) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.8832, 0.1513) + -- ( 0.8949, 0.1245) + -- ( 0.8456, 0.1031) + -- ( 0.8339, 0.1300) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.8832, 0.1513) + -- ( 0.8949, 0.1245) + -- ( 0.8456, 0.1031) + -- ( 0.8339, 0.1300) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.8604, 0.2135) + -- ( 0.8734, 0.1872) + -- ( 0.8254, 0.1634) + -- ( 0.8123, 0.1896) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.8604, 0.2135) + -- ( 0.8734, 0.1872) + -- ( 0.8254, 0.1634) + -- ( 0.8123, 0.1896) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.7675, 0.2368) + -- ( 0.7736, 0.2082) + -- ( 0.7210, 0.1970) + -- ( 0.7150, 0.2257) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.7675, 0.2368) + -- ( 0.7736, 0.2082) + -- ( 0.7210, 0.1970) + -- ( 0.7150, 0.2257) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.7696,-0.1796) + -- ( 0.7978,-0.1875) + -- ( 0.7835,-0.2392) + -- ( 0.7552,-0.2314) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.7696,-0.1796) + -- ( 0.7978,-0.1875) + -- ( 0.7835,-0.2392) + -- ( 0.7552,-0.2314) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.7546,-0.0830) + -- ( 0.7838,-0.0830) + -- ( 0.7838,-0.1367) + -- ( 0.7546,-0.1367) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.7546,-0.0830) + -- ( 0.7838,-0.0830) + -- ( 0.7838,-0.1367) + -- ( 0.7546,-0.1367) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.7114,-0.1735) + -- ( 0.7402,-0.1784) + -- ( 0.7313,-0.2313) + -- ( 0.7024,-0.2265) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.7114,-0.1735) + -- ( 0.7402,-0.1784) + -- ( 0.7313,-0.2313) + -- ( 0.7024,-0.2265) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6398,-0.0896) + -- ( 0.6691,-0.0896) + -- ( 0.6691,-0.1433) + -- ( 0.6398,-0.1433) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6398,-0.0896) + -- ( 0.6691,-0.0896) + -- ( 0.6691,-0.1433) + -- ( 0.6398,-0.1433) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5390,-0.1093) + -- ( 0.5377,-0.0801) + -- ( 0.5913,-0.0776) + -- ( 0.5927,-0.1069) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5390,-0.1093) + -- ( 0.5377,-0.0801) + -- ( 0.5913,-0.0776) + -- ( 0.5927,-0.1069) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5171,-0.2250) + -- ( 0.5252,-0.1968) + -- ( 0.5767,-0.2117) + -- ( 0.5687,-0.2399) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5171,-0.2250) + -- ( 0.5252,-0.1968) + -- ( 0.5767,-0.2117) + -- ( 0.5687,-0.2399) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5024,-0.2807) + -- ( 0.5066,-0.2517) + -- ( 0.5597,-0.2597) + -- ( 0.5555,-0.2887) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5024,-0.2807) + -- ( 0.5066,-0.2517) + -- ( 0.5597,-0.2597) + -- ( 0.5555,-0.2887) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6783,-0.2717) + -- ( 0.7056,-0.2824) + -- ( 0.6858,-0.3324) + -- ( 0.6585,-0.3216) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6783,-0.2717) + -- ( 0.7056,-0.2824) + -- ( 0.6858,-0.3324) + -- ( 0.6585,-0.3216) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4010,-0.3903) + -- ( 0.4019,-0.3609) + -- ( 0.4556,-0.3627) + -- ( 0.4547,-0.3921) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4010,-0.3903) + -- ( 0.4019,-0.3609) + -- ( 0.4556,-0.3627) + -- ( 0.4547,-0.3921) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6576,-0.1610) + -- ( 0.6852,-0.1708) + -- ( 0.6672,-0.2214) + -- ( 0.6396,-0.2116) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6576,-0.1610) + -- ( 0.6852,-0.1708) + -- ( 0.6672,-0.2214) + -- ( 0.6396,-0.2116) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4024,-0.7175) + -- ( 0.4484,-0.7175) + -- ( 0.4484,-0.7785) + -- ( 0.4024,-0.7785) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4024,-0.7175) + -- ( 0.4484,-0.7175) + -- ( 0.4484,-0.7785) + -- ( 0.4024,-0.7785) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3999,-0.7917) + -- (-0.3540,-0.7917) + -- (-0.3540,-0.8527) + -- (-0.3999,-0.8527) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3999,-0.7917) + -- (-0.3540,-0.7917) + -- (-0.3540,-0.8527) + -- (-0.3999,-0.8527) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.7770,-0.2886) + -- (-0.7319,-0.2679) + -- (-0.6985,-0.3406) + -- (-0.7437,-0.3613) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.7770,-0.2886) + -- (-0.7319,-0.2679) + -- (-0.6985,-0.3406) + -- (-0.7437,-0.3613) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1783,-0.5367) + -- (-0.1339,-0.5483) + -- (-0.1492,-0.6074) + -- (-0.1937,-0.5958) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1783,-0.5367) + -- (-0.1339,-0.5483) + -- (-0.1492,-0.6074) + -- (-0.1937,-0.5958) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3106,-0.7770) + -- ( 0.3564,-0.7770) + -- ( 0.3564,-0.8380) + -- ( 0.3106,-0.8380) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3106,-0.7770) + -- ( 0.3564,-0.7770) + -- ( 0.3564,-0.8380) + -- ( 0.3106,-0.8380) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0626,-0.7954) + -- (-0.0196,-0.8113) + -- (-0.0406,-0.8686) + -- (-0.0837,-0.8527) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0626,-0.7954) + -- (-0.0196,-0.8113) + -- (-0.0406,-0.8686) + -- (-0.0837,-0.8527) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0570,-0.7843) + -- ( 0.1025,-0.7910) + -- ( 0.0936,-0.8514) + -- ( 0.0481,-0.8446) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0570,-0.7843) + -- ( 0.1025,-0.7910) + -- ( 0.0936,-0.8514) + -- ( 0.0481,-0.8446) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0906,-0.6908) + -- ( 0.1345,-0.7046) + -- ( 0.1161,-0.7629) + -- ( 0.0723,-0.7490) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0906,-0.6908) + -- ( 0.1345,-0.7046) + -- ( 0.1161,-0.7629) + -- ( 0.0723,-0.7490) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4731,-0.7998) + -- (-0.4283,-0.7899) + -- (-0.4151,-0.8496) + -- (-0.4600,-0.8595) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4731,-0.7998) + -- (-0.4283,-0.7899) + -- (-0.4151,-0.8496) + -- (-0.4600,-0.8595) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4125,-0.0879) + -- ( 0.4578,-0.0951) + -- ( 0.4483,-0.1553) + -- ( 0.4029,-0.1481) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4125,-0.0879) + -- ( 0.4578,-0.0951) + -- ( 0.4483,-0.1553) + -- ( 0.4029,-0.1481) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2078, 0.8568) + -- ( 0.2536, 0.8583) + -- ( 0.2555, 0.7973) + -- ( 0.2097, 0.7958) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2078, 0.8568) + -- ( 0.2536, 0.8583) + -- ( 0.2555, 0.7973) + -- ( 0.2097, 0.7958) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5829,-0.2493) + -- ( 0.6289,-0.2493) + -- ( 0.6289,-0.3104) + -- ( 0.5829,-0.3104) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5829,-0.2493) + -- ( 0.6289,-0.2493) + -- ( 0.6289,-0.3104) + -- ( 0.5829,-0.3104) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2923,-0.1390) + -- ( 0.3109,-0.0970) + -- ( 0.3667,-0.1218) + -- ( 0.3481,-0.1638) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2923,-0.1390) + -- ( 0.3109,-0.0970) + -- ( 0.3667,-0.1218) + -- ( 0.3481,-0.1638) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6866,-0.0789) + -- ( 0.7324,-0.0789) + -- ( 0.7324,-0.1400) + -- ( 0.6866,-0.1400) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6866,-0.0789) + -- ( 0.7324,-0.0789) + -- ( 0.7324,-0.1400) + -- ( 0.6866,-0.1400) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.8206,-0.0922) + -- ( 0.8649,-0.1044) + -- ( 0.8487,-0.1632) + -- ( 0.8045,-0.1511) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.8206,-0.0922) + -- ( 0.8649,-0.1044) + -- ( 0.8487,-0.1632) + -- ( 0.8045,-0.1511) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3075, 0.5809) + -- (-0.2648, 0.5640) + -- (-0.2872, 0.5072) + -- (-0.3299, 0.5241) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3075, 0.5809) + -- (-0.2648, 0.5640) + -- (-0.2872, 0.5072) + -- (-0.3299, 0.5241) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.7746, 0.3900) + -- (-0.7312, 0.3750) + -- (-0.7511, 0.3173) + -- (-0.7945, 0.3322) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.7746, 0.3900) + -- (-0.7312, 0.3750) + -- (-0.7511, 0.3173) + -- (-0.7945, 0.3322) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.8224, 0.3024) + -- (-0.7807, 0.2831) + -- (-0.8064, 0.2277) + -- (-0.8481, 0.2470) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.8224, 0.3024) + -- (-0.7807, 0.2831) + -- (-0.8064, 0.2277) + -- (-0.8481, 0.2470) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.7172, 0.2999) + -- (-0.6959, 0.3406) + -- (-0.6418, 0.3122) + -- (-0.6632, 0.2715) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.7172, 0.2999) + -- (-0.6959, 0.3406) + -- (-0.6418, 0.3122) + -- (-0.6632, 0.2715) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.7505, 0.2368) + -- (-0.7273, 0.2764) + -- (-0.6746, 0.2456) + -- (-0.6979, 0.2060) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.7505, 0.2368) + -- (-0.7273, 0.2764) + -- (-0.6746, 0.2456) + -- (-0.6979, 0.2060) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.7726, 0.1668) + -- (-0.7521, 0.2080) + -- (-0.6975, 0.1808) + -- (-0.7180, 0.1396) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.7726, 0.1668) + -- (-0.7521, 0.2080) + -- (-0.6975, 0.1808) + -- (-0.7180, 0.1396) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.8067, 0.1033) + -- (-0.7877, 0.1452) + -- (-0.7322, 0.1199) + -- (-0.7512, 0.0781) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.8067, 0.1033) + -- (-0.7877, 0.1452) + -- (-0.7322, 0.1199) + -- (-0.7512, 0.0781) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.8292, 0.0434) + -- (-0.8106, 0.0854) + -- (-0.7548, 0.0608) + -- (-0.7733, 0.0188) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.8292, 0.0434) + -- (-0.8106, 0.0854) + -- (-0.7548, 0.0608) + -- (-0.7733, 0.0188) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.8479,-0.0238) + -- (-0.8336, 0.0199) + -- (-0.7757, 0.0009) + -- (-0.7899,-0.0427) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.8479,-0.0238) + -- (-0.8336, 0.0199) + -- (-0.7757, 0.0009) + -- (-0.7899,-0.0427) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.9015,-0.0795) + -- (-0.8746,-0.0423) + -- (-0.8252,-0.0782) + -- (-0.8521,-0.1153) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.9015,-0.0795) + -- (-0.8746,-0.0423) + -- (-0.8252,-0.0782) + -- (-0.8521,-0.1153) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5616,-0.6142) + -- (-0.5431,-0.6563) + -- (-0.5990,-0.6808) + -- (-0.6175,-0.6387) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5616,-0.6142) + -- (-0.5431,-0.6563) + -- (-0.5990,-0.6808) + -- (-0.6175,-0.6387) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0094,-0.6230) + -- ( 0.0047,-0.5793) + -- ( 0.0627,-0.5978) + -- ( 0.0487,-0.6416) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0094,-0.6230) + -- ( 0.0047,-0.5793) + -- ( 0.0627,-0.5978) + -- ( 0.0487,-0.6416) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0303,-0.4683) + -- ( 0.0443,-0.4246) + -- ( 0.1024,-0.4432) + -- ( 0.0884,-0.4869) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0303,-0.4683) + -- ( 0.0443,-0.4246) + -- ( 0.1024,-0.4432) + -- ( 0.0884,-0.4869) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2507,-0.3956) + -- (-0.2367,-0.3518) + -- (-0.1786,-0.3704) + -- (-0.1926,-0.4142) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2507,-0.3956) + -- (-0.2367,-0.3518) + -- (-0.1786,-0.3704) + -- (-0.1926,-0.4142) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3208,-0.3936) + -- (-0.3069,-0.3498) + -- (-0.2487,-0.3684) + -- (-0.2627,-0.4122) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3208,-0.3936) + -- (-0.3069,-0.3498) + -- (-0.2487,-0.3684) + -- (-0.2627,-0.4122) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1634,-0.1430) + -- ( 0.1790,-0.0997) + -- ( 0.2365,-0.1205) + -- ( 0.2209,-0.1637) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1634,-0.1430) + -- ( 0.1790,-0.0997) + -- ( 0.2365,-0.1205) + -- ( 0.2209,-0.1637) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1520,-0.2030) + -- ( 0.1715,-0.1614) + -- ( 0.2268,-0.1873) + -- ( 0.2072,-0.2289) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1520,-0.2030) + -- ( 0.1715,-0.1614) + -- ( 0.2268,-0.1873) + -- ( 0.2072,-0.2289) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0852,-0.3696) + -- ( 0.1047,-0.3280) + -- ( 0.1600,-0.3540) + -- ( 0.1404,-0.3956) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0852,-0.3696) + -- ( 0.1047,-0.3280) + -- ( 0.1600,-0.3540) + -- ( 0.1404,-0.3956) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0197,-0.2063) + -- ( 0.0392,-0.1647) + -- ( 0.0944,-0.1907) + -- ( 0.0750,-0.2323) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0197,-0.2063) + -- ( 0.0392,-0.1647) + -- ( 0.0944,-0.1907) + -- ( 0.0750,-0.2323) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3100, 0.7769) + -- ( 0.3513, 0.7971) + -- ( 0.3781, 0.7423) + -- ( 0.3369, 0.7221) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3100, 0.7769) + -- ( 0.3513, 0.7971) + -- ( 0.3781, 0.7423) + -- ( 0.3369, 0.7221) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5097, 0.3286) + -- ( 0.5510, 0.3488) + -- ( 0.5778, 0.2940) + -- ( 0.5366, 0.2738) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5097, 0.3286) + -- ( 0.5510, 0.3488) + -- ( 0.5778, 0.2940) + -- ( 0.5366, 0.2738) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4014, 0.8173) + -- ( 0.4429, 0.8369) + -- ( 0.4689, 0.7817) + -- ( 0.4274, 0.7621) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4014, 0.8173) + -- ( 0.4429, 0.8369) + -- ( 0.4689, 0.7817) + -- ( 0.4274, 0.7621) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2627, 0.7599) + -- ( 0.3055, 0.7765) + -- ( 0.3276, 0.7196) + -- ( 0.2848, 0.7030) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2627, 0.7599) + -- ( 0.3055, 0.7765) + -- ( 0.3276, 0.7196) + -- ( 0.2848, 0.7030) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1763, 0.7193) + -- ( 0.2174, 0.7400) + -- ( 0.2448, 0.6855) + -- ( 0.2038, 0.6648) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1763, 0.7193) + -- ( 0.2174, 0.7400) + -- ( 0.2448, 0.6855) + -- ( 0.2038, 0.6648) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0655, 0.4707) + -- (-0.0222, 0.4555) + -- (-0.0424, 0.3979) + -- (-0.0858, 0.4131) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0655, 0.4707) + -- (-0.0222, 0.4555) + -- (-0.0424, 0.3979) + -- (-0.0858, 0.4131) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0019, 0.5606) + -- ( 0.0452, 0.5454) + -- ( 0.0251, 0.4878) + -- (-0.0183, 0.5030) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0019, 0.5606) + -- ( 0.0452, 0.5454) + -- ( 0.0251, 0.4878) + -- (-0.0183, 0.5030) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0634, 0.0555) + -- ( 0.1067, 0.0403) + -- ( 0.0865,-0.0174) + -- ( 0.0432,-0.0022) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0634, 0.0555) + -- ( 0.1067, 0.0403) + -- ( 0.0865,-0.0174) + -- ( 0.0432,-0.0022) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0445, 0.0687) + -- (-0.0010, 0.0535) + -- (-0.0213,-0.0041) + -- (-0.0646, 0.0110) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0445, 0.0687) + -- (-0.0010, 0.0535) + -- (-0.0213,-0.0041) + -- (-0.0646, 0.0110) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0541, 0.5519) + -- ( 0.0966, 0.5344) + -- ( 0.0732, 0.4779) + -- ( 0.0308, 0.4956) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0541, 0.5519) + -- ( 0.0966, 0.5344) + -- ( 0.0732, 0.4779) + -- ( 0.0308, 0.4956) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0096, 0.8274) + -- ( 0.0163, 0.7820) + -- (-0.0441, 0.7731) + -- (-0.0508, 0.8185) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0096, 0.8274) + -- ( 0.0163, 0.7820) + -- (-0.0441, 0.7731) + -- (-0.0508, 0.8185) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0878, 0.6237) + -- (-0.0810, 0.5783) + -- (-0.1415, 0.5693) + -- (-0.1482, 0.6147) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0878, 0.6237) + -- (-0.0810, 0.5783) + -- (-0.1415, 0.5693) + -- (-0.1482, 0.6147) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0678, 0.8193) + -- (-0.0575, 0.7745) + -- (-0.1168, 0.7608) + -- (-0.1273, 0.8055) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0678, 0.8193) + -- (-0.0575, 0.7745) + -- (-0.1168, 0.7608) + -- (-0.1273, 0.8055) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1958, 0.8007) + -- (-0.1517, 0.7877) + -- (-0.1688, 0.7292) + -- (-0.2129, 0.7420) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1958, 0.8007) + -- (-0.1517, 0.7877) + -- (-0.1688, 0.7292) + -- (-0.2129, 0.7420) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6001, 0.0672) + -- ( 0.6452, 0.0758) + -- ( 0.6566, 0.0159) + -- ( 0.6115, 0.0072) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6001, 0.0672) + -- ( 0.6452, 0.0758) + -- ( 0.6566, 0.0159) + -- ( 0.6115, 0.0072) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.8357, 0.2798) + -- ( 0.8514, 0.2365) + -- ( 0.7940, 0.2158) + -- ( 0.7783, 0.2591) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.8357, 0.2798) + -- ( 0.8514, 0.2365) + -- ( 0.7940, 0.2158) + -- ( 0.7783, 0.2591) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4450, 0.0292) + -- ( 0.4606,-0.0141) + -- ( 0.4032,-0.0348) + -- ( 0.3876, 0.0085) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4450, 0.0292) + -- ( 0.4606,-0.0141) + -- ( 0.4032,-0.0348) + -- ( 0.3876, 0.0085) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.9043, 0.1125) + -- ( 0.9184, 0.0687) + -- ( 0.8603, 0.0500) + -- ( 0.8462, 0.0937) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.9043, 0.1125) + -- ( 0.9184, 0.0687) + -- ( 0.8603, 0.0500) + -- ( 0.8462, 0.0937) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.7148,-0.2814) + -- ( 0.7591,-0.2935) + -- ( 0.7430,-0.3524) + -- ( 0.6987,-0.3402) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.7148,-0.2814) + -- ( 0.7591,-0.2935) + -- ( 0.7430,-0.3524) + -- ( 0.6987,-0.3402) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5891,-0.1425) + -- ( 0.5806,-0.1876) + -- ( 0.5207,-0.1764) + -- ( 0.5291,-0.1313) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5891,-0.1425) + -- ( 0.5806,-0.1876) + -- ( 0.5207,-0.1764) + -- ( 0.5291,-0.1313) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5865, 0.0684) + -- ( 0.5782, 0.0233) + -- ( 0.5181, 0.0345) + -- ( 0.5266, 0.0796) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5865, 0.0684) + -- ( 0.5782, 0.0233) + -- ( 0.5181, 0.0345) + -- ( 0.5266, 0.0796) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4044,-0.3422) + -- ( 0.4189,-0.2987) + -- ( 0.4768,-0.3180) + -- ( 0.4623,-0.3616) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4044,-0.3422) + -- ( 0.4189,-0.2987) + -- ( 0.4768,-0.3180) + -- ( 0.4623,-0.3616) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4665,-0.7188) + -- ( 0.5125,-0.7188) + -- ( 0.5125,-0.7799) + -- ( 0.4665,-0.7799) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4665,-0.7188) + -- ( 0.5125,-0.7188) + -- ( 0.5125,-0.7799) + -- ( 0.4665,-0.7799) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1285,-0.5747) + -- (-0.0826,-0.5747) + -- (-0.0826,-0.6356) + -- (-0.1285,-0.6356) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1285,-0.5747) + -- (-0.0826,-0.5747) + -- (-0.0826,-0.6356) + -- (-0.1285,-0.6356) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2861,-0.6694) + -- (-0.2789,-0.6240) + -- (-0.2186,-0.6336) + -- (-0.2258,-0.6789) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2861,-0.6694) + -- (-0.2789,-0.6240) + -- (-0.2186,-0.6336) + -- (-0.2258,-0.6789) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1486,-0.3725) + -- (-0.1414,-0.3271) + -- (-0.0811,-0.3367) + -- (-0.0883,-0.3820) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1486,-0.3725) + -- (-0.1414,-0.3271) + -- (-0.0811,-0.3367) + -- (-0.0883,-0.3820) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3576,-0.5916) + -- (-0.3319,-0.6297) + -- (-0.3826,-0.6638) + -- (-0.4082,-0.6256) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3576,-0.5916) + -- (-0.3319,-0.6297) + -- (-0.3826,-0.6638) + -- (-0.4082,-0.6256) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5468,-0.2716) + -- (-0.5213,-0.3098) + -- (-0.5719,-0.3438) + -- (-0.5976,-0.3056) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5468,-0.2716) + -- (-0.5213,-0.3098) + -- (-0.5719,-0.3438) + -- (-0.5976,-0.3056) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4969,-0.5222) + -- (-0.4767,-0.5634) + -- (-0.5315,-0.5902) + -- (-0.5518,-0.5490) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4969,-0.5222) + -- (-0.4767,-0.5634) + -- (-0.5315,-0.5902) + -- (-0.5518,-0.5490) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3963,-0.6922) + -- (-0.3778,-0.7343) + -- (-0.4338,-0.7588) + -- (-0.4522,-0.7168) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3963,-0.6922) + -- (-0.3778,-0.7343) + -- (-0.4338,-0.7588) + -- (-0.4522,-0.7168) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6145,-0.5157) + -- (-0.5944,-0.5570) + -- (-0.6493,-0.5836) + -- (-0.6694,-0.5423) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6145,-0.5157) + -- (-0.5944,-0.5570) + -- (-0.6493,-0.5836) + -- (-0.6694,-0.5423) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.8791,-0.2053) + -- (-0.8402,-0.1810) + -- (-0.8079,-0.2327) + -- (-0.8468,-0.2571) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.8791,-0.2053) + -- (-0.8402,-0.1810) + -- (-0.8079,-0.2327) + -- (-0.8468,-0.2571) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.9144, 0.1039) + -- (-0.8919, 0.1439) + -- (-0.8388, 0.1140) + -- (-0.8613, 0.0740) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.9144, 0.1039) + -- (-0.8919, 0.1439) + -- (-0.8388, 0.1140) + -- (-0.8613, 0.0740) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4095, 0.2277) + -- (-0.3639, 0.2229) + -- (-0.3703, 0.1622) + -- (-0.4159, 0.1670) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4095, 0.2277) + -- (-0.3639, 0.2229) + -- (-0.3703, 0.1622) + -- (-0.4159, 0.1670) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3590, 0.4200) + -- (-0.3365, 0.4600) + -- (-0.2833, 0.4302) + -- (-0.3058, 0.3901) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3590, 0.4200) + -- (-0.3365, 0.4600) + -- (-0.2833, 0.4302) + -- (-0.3058, 0.3901) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0764, 0.3204) + -- (-0.0539, 0.3604) + -- (-0.0007, 0.3306) + -- (-0.0232, 0.2905) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0764, 0.3204) + -- (-0.0539, 0.3604) + -- (-0.0007, 0.3306) + -- (-0.0232, 0.2905) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1364, 0.0430) + -- (-0.1139, 0.0831) + -- (-0.0607, 0.0532) + -- (-0.0832, 0.0131) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1364, 0.0430) + -- (-0.1139, 0.0831) + -- (-0.0607, 0.0532) + -- (-0.0832, 0.0131) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1269, 0.1239) + -- (-0.1149, 0.1681) + -- (-0.0560, 0.1521) + -- (-0.0681, 0.1078) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1269, 0.1239) + -- (-0.1149, 0.1681) + -- (-0.0560, 0.1521) + -- (-0.0681, 0.1078) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6443,-0.1022) + -- (-0.6321,-0.0579) + -- (-0.5733,-0.0740) + -- (-0.5854,-0.1183) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6443,-0.1022) + -- (-0.6321,-0.0579) + -- (-0.5733,-0.0740) + -- (-0.5854,-0.1183) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6032, 0.2357) + -- (-0.5912, 0.2800) + -- (-0.5323, 0.2639) + -- (-0.5443, 0.2196) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6032, 0.2357) + -- (-0.5912, 0.2800) + -- (-0.5323, 0.2639) + -- (-0.5443, 0.2196) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.7230, 0.0020) + -- (-0.7026, 0.0432) + -- (-0.6479, 0.0162) + -- (-0.6682,-0.0250) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.7230, 0.0020) + -- (-0.7026, 0.0432) + -- (-0.6479, 0.0162) + -- (-0.6682,-0.0250) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5055, 0.2596) + -- (-0.4629, 0.2423) + -- (-0.4859, 0.1858) + -- (-0.5285, 0.2031) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5055, 0.2596) + -- (-0.4629, 0.2423) + -- (-0.4859, 0.1858) + -- (-0.5285, 0.2031) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1337, 0.3296) + -- ( 0.1283, 0.2840) + -- ( 0.0677, 0.2911) + -- ( 0.0731, 0.3367) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1337, 0.3296) + -- ( 0.1283, 0.2840) + -- ( 0.0677, 0.2911) + -- ( 0.0731, 0.3367) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1476, 0.4414) + -- ( 0.1506, 0.3955) + -- ( 0.0897, 0.3916) + -- ( 0.0867, 0.4375) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1476, 0.4414) + -- ( 0.1506, 0.3955) + -- ( 0.0897, 0.3916) + -- ( 0.0867, 0.4375) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0539,-0.1542) + -- ( 0.0687,-0.1107) + -- ( 0.1264,-0.1304) + -- ( 0.1116,-0.1738) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0539,-0.1542) + -- ( 0.0687,-0.1107) + -- ( 0.1264,-0.1304) + -- ( 0.1116,-0.1738) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0962,-0.1436) + -- (-0.0814,-0.1001) + -- (-0.0237,-0.1198) + -- (-0.0385,-0.1633) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0962,-0.1436) + -- (-0.0814,-0.1001) + -- (-0.0237,-0.1198) + -- (-0.0385,-0.1633) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1683,-0.0622) + -- (-0.1535,-0.0188) + -- (-0.0958,-0.0385) + -- (-0.1106,-0.0820) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1683,-0.0622) + -- (-0.1535,-0.0188) + -- (-0.0958,-0.0385) + -- (-0.1106,-0.0820) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1842,-0.1310) + -- (-0.1694,-0.0876) + -- (-0.1116,-0.1073) + -- (-0.1264,-0.1508) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1842,-0.1310) + -- (-0.1694,-0.0876) + -- (-0.1116,-0.1073) + -- (-0.1264,-0.1508) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1167,-0.5813) + -- ( 0.1315,-0.5379) + -- ( 0.1892,-0.5576) + -- ( 0.1744,-0.6011) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1167,-0.5813) + -- ( 0.1315,-0.5379) + -- ( 0.1892,-0.5576) + -- ( 0.1744,-0.6011) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0916,-0.6322) + -- ( 0.1064,-0.5888) + -- ( 0.1642,-0.6085) + -- ( 0.1493,-0.6520) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0916,-0.6322) + -- ( 0.1064,-0.5888) + -- ( 0.1642,-0.6085) + -- ( 0.1493,-0.6520) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3791,-0.5978) + -- ( 0.3941,-0.5544) + -- ( 0.4518,-0.5741) + -- ( 0.4369,-0.6176) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3791,-0.5978) + -- ( 0.3941,-0.5544) + -- ( 0.4518,-0.5741) + -- ( 0.4369,-0.6176) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4116,-0.5397) + -- ( 0.4392,-0.5029) + -- ( 0.4880,-0.5396) + -- ( 0.4604,-0.5764) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4116,-0.5397) + -- ( 0.4392,-0.5029) + -- ( 0.4880,-0.5396) + -- ( 0.4604,-0.5764) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2218,-0.5853) + -- ( 0.2366,-0.5418) + -- ( 0.2944,-0.5615) + -- ( 0.2796,-0.6051) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2218,-0.5853) + -- ( 0.2366,-0.5418) + -- ( 0.2944,-0.5615) + -- ( 0.2796,-0.6051) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3094, 0.1262) + -- ( 0.3519, 0.1085) + -- ( 0.3284, 0.0522) + -- ( 0.2860, 0.0698) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3094, 0.1262) + -- ( 0.3519, 0.1085) + -- ( 0.3284, 0.0522) + -- ( 0.2860, 0.0698) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2797, 0.1784) + -- ( 0.3041, 0.1395) + -- ( 0.2524, 0.1070) + -- ( 0.2280, 0.1459) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2797, 0.1784) + -- ( 0.3041, 0.1395) + -- ( 0.2524, 0.1070) + -- ( 0.2280, 0.1459) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.7950, 0.1548) + -- ( 0.8065, 0.1103) + -- ( 0.7475, 0.0949) + -- ( 0.7359, 0.1394) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.7950, 0.1548) + -- ( 0.8065, 0.1103) + -- ( 0.7475, 0.0949) + -- ( 0.7359, 0.1394) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5739, 0.6926) + -- ( 0.5961, 0.6525) + -- ( 0.5427, 0.6229) + -- ( 0.5205, 0.6632) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5739, 0.6926) + -- ( 0.5961, 0.6525) + -- ( 0.5427, 0.6229) + -- ( 0.5205, 0.6632) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6499, 0.5535) + -- ( 0.6714, 0.5129) + -- ( 0.6174, 0.4844) + -- ( 0.5959, 0.5250) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6499, 0.5535) + -- ( 0.6714, 0.5129) + -- ( 0.6174, 0.4844) + -- ( 0.5959, 0.5250) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4994, 0.7998) + -- (-0.4558, 0.8143) + -- (-0.4364, 0.7565) + -- (-0.4800, 0.7419) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4994, 0.7998) + -- (-0.4558, 0.8143) + -- (-0.4364, 0.7565) + -- (-0.4800, 0.7419) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3350, 0.7630) + -- (-0.2917, 0.7475) + -- (-0.3125, 0.6901) + -- (-0.3558, 0.7057) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3350, 0.7630) + -- (-0.2917, 0.7475) + -- (-0.3125, 0.6901) + -- (-0.3558, 0.7057) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4472, 0.6282) + -- (-0.4040, 0.6124) + -- (-0.4252, 0.5551) + -- (-0.4683, 0.5710) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4472, 0.6282) + -- (-0.4040, 0.6124) + -- (-0.4252, 0.5551) + -- (-0.4683, 0.5710) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5200, 0.6603) + -- (-0.4792, 0.6394) + -- (-0.5070, 0.5851) + -- (-0.5480, 0.6061) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5200, 0.6603) + -- (-0.4792, 0.6394) + -- (-0.5070, 0.5851) + -- (-0.5480, 0.6061) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5301, 0.5359) + -- (-0.4915, 0.5109) + -- (-0.5247, 0.4597) + -- (-0.5633, 0.4846) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5301, 0.5359) + -- (-0.4915, 0.5109) + -- (-0.5247, 0.4597) + -- (-0.5633, 0.4846) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6860, 0.5063) + -- (-0.6426, 0.4914) + -- (-0.6624, 0.4337) + -- (-0.7058, 0.4486) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6860, 0.5063) + -- (-0.6426, 0.4914) + -- (-0.6624, 0.4337) + -- (-0.7058, 0.4486) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5849, 0.4574) + -- (-0.5414, 0.4425) + -- (-0.5613, 0.3847) + -- (-0.6047, 0.3997) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5849, 0.4574) + -- (-0.5414, 0.4425) + -- (-0.5613, 0.3847) + -- (-0.6047, 0.3997) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4531,-0.1794) + -- (-0.4094,-0.1941) + -- (-0.4289,-0.2518) + -- (-0.4725,-0.2372) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4531,-0.1794) + -- (-0.4094,-0.1941) + -- (-0.4289,-0.2518) + -- (-0.4725,-0.2372) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3573, 0.0277) + -- (-0.3138, 0.0131) + -- (-0.3333,-0.0447) + -- (-0.3768,-0.0300) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3573, 0.0277) + -- (-0.3138, 0.0131) + -- (-0.3333,-0.0447) + -- (-0.3768,-0.0300) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3354,-0.4695) + -- ( 0.3141,-0.5101) + -- ( 0.2601,-0.4816) + -- ( 0.2815,-0.4410) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3354,-0.4695) + -- ( 0.3141,-0.5101) + -- ( 0.2601,-0.4816) + -- ( 0.2815,-0.4410) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6206,-0.4111) + -- ( 0.6599,-0.4350) + -- ( 0.6281,-0.4872) + -- ( 0.5889,-0.4632) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6206,-0.4111) + -- ( 0.6599,-0.4350) + -- ( 0.6281,-0.4872) + -- ( 0.5889,-0.4632) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6061,-0.5834) + -- ( 0.6495,-0.5984) + -- ( 0.6296,-0.6561) + -- ( 0.5861,-0.6411) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.6061,-0.5834) + -- ( 0.6495,-0.5984) + -- ( 0.6296,-0.6561) + -- ( 0.5861,-0.6411) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2902, 0.2707) + -- ( 0.3361, 0.2673) + -- ( 0.3317, 0.2065) + -- ( 0.2859, 0.2098) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2902, 0.2707) + -- ( 0.3361, 0.2673) + -- ( 0.3317, 0.2065) + -- ( 0.2859, 0.2098) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2215, 0.2766) + -- ( 0.2673, 0.2733) + -- ( 0.2630, 0.2124) + -- ( 0.2172, 0.2157) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2215, 0.2766) + -- ( 0.2673, 0.2733) + -- ( 0.2630, 0.2124) + -- ( 0.2172, 0.2157) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0159, 0.4498) + -- ( 0.0299, 0.4466) + -- ( 0.0256, 0.3857) + -- (-0.0202, 0.3889) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0159, 0.4498) + -- ( 0.0299, 0.4466) + -- ( 0.0256, 0.3857) + -- (-0.0202, 0.3889) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0377, 0.1701) + -- ( 0.0835, 0.1668) + -- ( 0.0791, 0.1060) + -- ( 0.0333, 0.1092) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0377, 0.1701) + -- ( 0.0835, 0.1668) + -- ( 0.0791, 0.1060) + -- ( 0.0333, 0.1092) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0944, 0.1648) + -- ( 0.1403, 0.1657) + -- ( 0.1415, 0.1047) + -- ( 0.0955, 0.1038) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0944, 0.1648) + -- ( 0.1403, 0.1657) + -- ( 0.1415, 0.1047) + -- ( 0.0955, 0.1038) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2434, 0.4429) + -- ( 0.2698, 0.4054) + -- ( 0.2199, 0.3702) + -- ( 0.1935, 0.4077) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2434, 0.4429) + -- ( 0.2698, 0.4054) + -- ( 0.2199, 0.3702) + -- ( 0.1935, 0.4077) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4777, 0.5914) + -- ( 0.4980, 0.5501) + -- ( 0.4432, 0.5232) + -- ( 0.4229, 0.5644) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4777, 0.5914) + -- ( 0.4980, 0.5501) + -- ( 0.4432, 0.5232) + -- ( 0.4229, 0.5644) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4936, 0.5331) + -- ( 0.5191, 0.4949) + -- ( 0.4683, 0.4611) + -- ( 0.4428, 0.4993) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4936, 0.5331) + -- ( 0.5191, 0.4949) + -- ( 0.4683, 0.4611) + -- ( 0.4428, 0.4993) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4667, 0.4393) + -- ( 0.4871, 0.3980) + -- ( 0.4323, 0.3711) + -- ( 0.4120, 0.4123) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4667, 0.4393) + -- ( 0.4871, 0.3980) + -- ( 0.4323, 0.3711) + -- ( 0.4120, 0.4123) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2446,-0.1495) + -- (-0.2153,-0.1488) + -- (-0.2138,-0.2024) + -- (-0.2431,-0.2032) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2446,-0.1495) + -- (-0.2153,-0.1488) + -- (-0.2138,-0.2024) + -- (-0.2431,-0.2032) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1018, 0.2179) + -- (-0.0915, 0.2454) + -- (-0.0412, 0.2264) + -- (-0.0516, 0.1989) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1018, 0.2179) + -- (-0.0915, 0.2454) + -- (-0.0412, 0.2264) + -- (-0.0516, 0.1989) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4189, 0.2515) + -- ( 0.4645, 0.2567) + -- ( 0.4714, 0.1960) + -- ( 0.4257, 0.1909) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4189, 0.2515) + -- ( 0.4645, 0.2567) + -- ( 0.4714, 0.1960) + -- ( 0.4257, 0.1909) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5784, 0.2650) + -- ( 0.6240, 0.2702) + -- ( 0.6308, 0.2095) + -- ( 0.5852, 0.2043) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5784, 0.2650) + -- ( 0.6240, 0.2702) + -- ( 0.6308, 0.2095) + -- ( 0.5852, 0.2043) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5509, 0.4874) + -- ( 0.5966, 0.4925) + -- ( 0.6034, 0.4319) + -- ( 0.5577, 0.4267) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5509, 0.4874) + -- ( 0.5966, 0.4925) + -- ( 0.6034, 0.4319) + -- ( 0.5577, 0.4267) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1390, 0.6195) + -- ( 0.1654, 0.5820) + -- ( 0.1155, 0.5468) + -- ( 0.0890, 0.5843) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1390, 0.6195) + -- ( 0.1654, 0.5820) + -- ( 0.1155, 0.5468) + -- ( 0.0890, 0.5843) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1780,-0.4082) + -- (-0.1533,-0.3695) + -- (-0.1018,-0.4023) + -- (-0.1265,-0.4410) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1780,-0.4082) + -- (-0.1533,-0.3695) + -- (-0.1018,-0.4023) + -- (-0.1265,-0.4410) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2611,-0.2396) + -- (-0.2175,-0.2543) + -- (-0.2370,-0.3121) + -- (-0.2805,-0.2974) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2611,-0.2396) + -- (-0.2175,-0.2543) + -- (-0.2370,-0.3121) + -- (-0.2805,-0.2974) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1640,-0.8299) + -- ( 0.1872,-0.8299) + -- ( 0.1872,-0.8565) + -- ( 0.1640,-0.8565) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1640,-0.8299) + -- ( 0.1872,-0.8299) + -- ( 0.1872,-0.8565) + -- ( 0.1640,-0.8565) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1330,-0.7413) + -- (-0.1099,-0.7413) + -- (-0.1099,-0.7679) + -- (-0.1330,-0.7679) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1330,-0.7413) + -- (-0.1099,-0.7413) + -- (-0.1099,-0.7679) + -- (-0.1330,-0.7679) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3280,-0.8061) + -- (-0.3049,-0.8061) + -- (-0.3049,-0.8327) + -- (-0.3280,-0.8327) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3280,-0.8061) + -- (-0.3049,-0.8061) + -- (-0.3049,-0.8327) + -- (-0.3280,-0.8327) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.7302,-0.0754) + -- (-0.7099,-0.0866) + -- (-0.7228,-0.1099) + -- (-0.7430,-0.0988) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.7302,-0.0754) + -- (-0.7099,-0.0866) + -- (-0.7228,-0.1099) + -- (-0.7430,-0.0988) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0147, 0.1985) + -- ( 0.0078, 0.1934) + -- ( 0.0020, 0.1675) + -- (-0.0206, 0.1726) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0147, 0.1985) + -- ( 0.0078, 0.1934) + -- ( 0.0020, 0.1675) + -- (-0.0206, 0.1726) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.7613, 0.0272) + -- ( 0.7841, 0.0313) + -- ( 0.7889, 0.0050) + -- ( 0.7661, 0.0009) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.7613, 0.0272) + -- ( 0.7841, 0.0313) + -- ( 0.7889, 0.0050) + -- ( 0.7661, 0.0009) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0160, 0.0427) + -- ( 0.0379, 0.0352) + -- ( 0.0294, 0.0100) + -- ( 0.0075, 0.0174) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0160, 0.0427) + -- ( 0.0379, 0.0352) + -- ( 0.0294, 0.0100) + -- ( 0.0075, 0.0174) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3515,-0.2403) + -- ( 0.3743,-0.2442) + -- ( 0.3697,-0.2705) + -- ( 0.3469,-0.2665) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3515,-0.2403) + -- ( 0.3743,-0.2442) + -- ( 0.3697,-0.2705) + -- ( 0.3469,-0.2665) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0718, 0.3637) + -- ( 0.0933, 0.3723) + -- ( 0.1032, 0.3476) + -- ( 0.0817, 0.3390) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0718, 0.3637) + -- ( 0.0933, 0.3723) + -- ( 0.1032, 0.3476) + -- ( 0.0817, 0.3390) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2555, 0.2647) + -- (-0.2413, 0.2902) + -- (-0.1944, 0.2641) + -- (-0.2086, 0.2385) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2555, 0.2647) + -- (-0.2413, 0.2902) + -- (-0.1944, 0.2641) + -- (-0.2086, 0.2385) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2832, 0.1509) + -- (-0.2826, 0.1802) + -- (-0.2289, 0.1792) + -- (-0.2295, 0.1498) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2832, 0.1509) + -- (-0.2826, 0.1802) + -- (-0.2289, 0.1792) + -- (-0.2295, 0.1498) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5694, 0.6977) + -- (-0.5248, 0.6870) + -- (-0.5390, 0.6277) + -- (-0.5837, 0.6384) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5694, 0.6977) + -- (-0.5248, 0.6870) + -- (-0.5390, 0.6277) + -- (-0.5837, 0.6384) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6046, 0.6071) + -- (-0.5747, 0.5723) + -- (-0.6210, 0.5326) + -- (-0.6509, 0.5674) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6046, 0.6071) + -- (-0.5747, 0.5723) + -- (-0.6210, 0.5326) + -- (-0.6509, 0.5674) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2915,-0.1208) + -- (-0.2462,-0.1288) + -- (-0.2569,-0.1889) + -- (-0.3021,-0.1809) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2915,-0.1208) + -- (-0.2462,-0.1288) + -- (-0.2569,-0.1889) + -- (-0.3021,-0.1809) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1636, 0.0236) + -- ( 0.2095, 0.0215) + -- ( 0.2067,-0.0394) + -- ( 0.1608,-0.0374) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1636, 0.0236) + -- ( 0.2095, 0.0215) + -- ( 0.2067,-0.0394) + -- ( 0.1608,-0.0374) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0653,-0.5296) + -- (-0.0423,-0.5269) + -- (-0.0391,-0.5533) + -- (-0.0621,-0.5560) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0653,-0.5296) + -- (-0.0423,-0.5269) + -- (-0.0391,-0.5533) + -- (-0.0621,-0.5560) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3393, 0.1912) + -- (-0.3173, 0.1843) + -- (-0.3254, 0.1589) + -- (-0.3474, 0.1659) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3393, 0.1912) + -- (-0.3173, 0.1843) + -- (-0.3254, 0.1589) + -- (-0.3474, 0.1659) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2247, 0.5875) + -- (-0.2027, 0.5801) + -- (-0.2113, 0.5549) + -- (-0.2332, 0.5623) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2247, 0.5875) + -- (-0.2027, 0.5801) + -- (-0.2113, 0.5549) + -- (-0.2332, 0.5623) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3747, 0.1590) + -- ( 0.4022, 0.1690) + -- ( 0.4206, 0.1185) + -- ( 0.3930, 0.1085) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3747, 0.1590) + -- ( 0.4022, 0.1690) + -- ( 0.4206, 0.1185) + -- ( 0.3930, 0.1085) + --cycle + ; + } +} +\fi +% \end{macrocode} +% \end{TikzKey} +% \iffalse +%</hex> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/hex/terrain/light_woods.dtx b/macros/latex/contrib/wargame/source/hex/terrain/light_woods.dtx new file mode 100644 index 0000000000..ee15f5ce78 --- /dev/null +++ b/macros/latex/contrib/wargame/source/hex/terrain/light_woods.dtx @@ -0,0 +1,848 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*hex> +% \fi +% \begin{TikzKey}{hex/terrain/light woods} +% The draw style for light woods. The pattern is filled with light +% green, and outline is not drawn. +% +% \begin{macrocode} +\tikzset{ + hex/terrain/light woods/.style={ + draw=none, + fill={rgb,100:red,69;green,98;blue,69} + } +} +% \end{macrocode} +% \end{TikzKey} +% +% \begin{TikzKey}{hex/terrain/light woods} +% Next, we have light woods. +% +% \begin{macrocode} +\ifhex@terrain@pic +\tikzset{ + hex/terrain/light woods/.pic={ + \path[hex/terrain/light woods,pic actions,draw=none] + (-0.4795, 0.8736) + -- (-0.5104, 0.8207) + .. controls (-0.5041, 0.8191) and (-0.4967, 0.8182) .. (-0.4854, 0.8192) + -- (-0.4770, 0.8108) + -- (-0.4854, 0.7856) + -- (-0.5190, 0.8023) + .. controls (-0.5219, 0.7975) and (-0.5245, 0.7958) .. (-0.5272, 0.7916) + -- (-0.5881, 0.6872) + .. controls (-0.5849, 0.6876) and (-0.5819, 0.6876) .. (-0.5782, 0.6885) + .. controls (-0.5524, 0.6946) and (-0.5387, 0.7153) .. (-0.5182, 0.7298) + .. controls (-0.4841, 0.7540) and (-0.4420, 0.7539) .. (-0.4346, 0.7864) + .. controls (-0.4295, 0.8088) and (-0.4470, 0.8265) .. (-0.4572, 0.8444) + .. controls (-0.4631, 0.8549) and (-0.4670, 0.8646) .. (-0.4707, 0.8736) + --cycle + (-0.3185, 0.8722) + .. controls (-0.3478, 0.8487) and (-0.3526, 0.8080) .. (-0.3290, 0.7808) + .. controls (-0.3140, 0.7633) and (-0.2394, 0.7433) .. (-0.2165, 0.7459) + .. controls (-0.1895, 0.7488) and (-0.1787, 0.7643) .. (-0.1561, 0.7725) + .. controls (-0.1380, 0.7791) and (-0.1179, 0.7766) .. (-0.1025, 0.7906) + .. controls (-0.0719, 0.8182) and (-0.0936, 0.8427) .. (-0.1240, 0.8528) + -- (-0.1323, 0.8192) + -- (-0.1912, 0.8359) + .. controls (-0.1985, 0.8023) and (-0.1999, 0.7965) .. (-0.2332, 0.7856) + .. controls (-0.2512, 0.8363) and (-0.2775, 0.8009) .. (-0.2909, 0.8240) + .. controls (-0.2975, 0.8355) and (-0.2884, 0.8535) .. (-0.2756, 0.8719) + --cycle + (-0.1660, 0.8709) + .. controls (-0.1609, 0.8538) and (-0.1460, 0.8596) .. (-0.1371, 0.8707) + --cycle + ( 0.0768, 0.8689) + .. controls ( 0.0767, 0.8688) and ( 0.0765, 0.8686) .. ( 0.0764, 0.8685) + .. controls ( 0.0704, 0.8503) and ( 0.0779, 0.7592) .. ( 0.1533, 0.7700) + .. controls ( 0.1955, 0.7761) and ( 0.1956, 0.8018) .. ( 0.1871, 0.8359) + -- ( 0.1366, 0.8108) + -- ( 0.1510, 0.8683) + --cycle + ( 0.1840, 0.8680) + .. controls ( 0.1910, 0.8650) and ( 0.1993, 0.8662) .. ( 0.2081, 0.8678) + --cycle + ( 0.2214, 0.8677) + -- ( 0.2459, 0.7939) + .. controls ( 0.1903, 0.7716) and ( 0.2267, 0.7399) .. ( 0.2534, 0.7490) + .. controls ( 0.2925, 0.7624) and ( 0.2842, 0.8066) .. ( 0.2735, 0.8359) + .. controls ( 0.2690, 0.8483) and ( 0.2655, 0.8586) .. ( 0.2619, 0.8674) + --cycle + ( 0.4057, 0.8661) + .. controls ( 0.4149, 0.8349) and ( 0.4483, 0.8068) .. ( 0.4873, 0.8349) + .. controls ( 0.4993, 0.8436) and ( 0.5001, 0.8496) .. ( 0.5065, 0.8612) + .. controls ( 0.5170, 0.8447) and ( 0.5269, 0.8297) .. ( 0.5405, 0.8189) + -- ( 0.5145, 0.8652) + --cycle + (-0.0288, 0.8391) + .. controls (-0.0335, 0.8388) and (-0.0390, 0.8377) .. (-0.0453, 0.8356) + .. controls (-0.0698, 0.8019) and (-0.0347, 0.7882) .. (-0.0173, 0.7966) + .. controls ( 0.0001, 0.8052) and ( 0.0042, 0.8413) .. (-0.0288, 0.8391) + --cycle + ( 0.3888, 0.7856) + -- ( 0.3719, 0.7687) + -- ( 0.3719, 0.7604) + -- ( 0.3888, 0.7435) + -- ( 0.3972, 0.7435) + -- ( 0.4140, 0.7604) + --cycle + (-0.0821, 0.7138) + .. controls (-0.0999, 0.7158) and (-0.1171, 0.7050) .. (-0.1211, 0.6922) + .. controls (-0.1297, 0.6650) and (-0.0695, 0.6250) .. (-0.0468, 0.6186) + .. controls (-0.0352, 0.6169) and (-0.0107, 0.6175) .. ( 0.0022, 0.6186) + .. controls (-0.0326, 0.5765) and (-0.0411, 0.5767) .. (-0.0909, 0.5922) + .. controls (-0.0924, 0.5799) and (-0.0959, 0.5731) .. (-0.0909, 0.5597) + .. controls (-0.0591, 0.4605) and ( 0.1221, 0.6255) .. ( 0.0020, 0.6581) + .. controls (-0.0090, 0.6597) and (-0.0281, 0.6592) .. (-0.0399, 0.6581) + .. controls (-0.0462, 0.6969) and (-0.0645, 0.7118) .. (-0.0821, 0.7138) + --cycle + ( 0.3704, 0.7106) + .. controls ( 0.3510, 0.7072) and ( 0.3332, 0.6943) .. ( 0.3224, 0.6679) + .. controls ( 0.3172, 0.6530) and ( 0.3220, 0.6121) .. ( 0.3224, 0.5922) + -- ( 0.3056, 0.6154) + .. controls ( 0.2531, 0.6742) and ( 0.2322, 0.5554) .. ( 0.2966, 0.5454) + .. controls ( 0.3239, 0.5412) and ( 0.3417, 0.5630) .. ( 0.3972, 0.5670) + .. controls ( 0.4005, 0.5473) and ( 0.4019, 0.5314) .. ( 0.4237, 0.5231) + .. controls ( 0.4541, 0.5116) and ( 0.4961, 0.5392) .. ( 0.4841, 0.5736) + .. controls ( 0.4794, 0.5870) and ( 0.4556, 0.5991) .. ( 0.4331, 0.6106) + .. controls ( 0.4972, 0.6497) and ( 0.4277, 0.7210) .. ( 0.3704, 0.7106) + --cycle + (-0.4679, 0.7004) + .. controls (-0.5116, 0.6983) and (-0.4629, 0.6153) .. (-0.4266, 0.6632) + .. controls (-0.4200, 0.6718) and (-0.4201, 0.6786) .. (-0.4182, 0.6846) + -- (-0.4434, 0.6958) + .. controls (-0.4536, 0.6993) and (-0.4618, 0.7007) .. (-0.4679, 0.7004) + --cycle + ( 0.5653, 0.7002) + .. controls ( 0.5661, 0.6911) and ( 0.5658, 0.6799) .. ( 0.5704, 0.6702) + .. controls ( 0.5856, 0.6381) and ( 0.6183, 0.6504) .. ( 0.6246, 0.6688) + -- ( 0.6102, 0.6944) + .. controls ( 0.6066, 0.6965) and ( 0.6036, 0.6986) .. ( 0.5984, 0.7002) + .. controls ( 0.5884, 0.7016) and ( 0.5757, 0.7012) .. ( 0.5653, 0.7002) + --cycle + ( 0.1310, 0.6925) + .. controls ( 0.1003, 0.6568) and ( 0.1392, 0.6414) .. ( 0.1582, 0.6530) + .. controls ( 0.1772, 0.6646) and ( 0.1778, 0.7030) .. ( 0.1310, 0.6925) + --cycle + (-0.3425, 0.6846) + .. controls (-0.3485, 0.6703) and (-0.3540, 0.6584) .. (-0.3564, 0.6427) + .. controls (-0.3714, 0.5438) and (-0.2673, 0.5839) .. (-0.3103, 0.6583) + .. controls (-0.3198, 0.6747) and (-0.3272, 0.6765) .. (-0.3425, 0.6846) + --cycle + (-0.1828, 0.6763) + .. controls (-0.2468, 0.6411) and (-0.2396, 0.5532) .. (-0.1659, 0.5602) + .. controls (-0.1273, 0.5639) and (-0.0946, 0.6066) .. (-0.1492, 0.6258) + -- (-0.1828, 0.6006) + --cycle + ( 0.3972, 0.6763) + -- ( 0.4287, 0.6131) + .. controls ( 0.4206, 0.6173) and ( 0.4113, 0.6217) .. ( 0.4056, 0.6258) + -- ( 0.3719, 0.6006) + .. controls ( 0.3635, 0.6415) and ( 0.3652, 0.6489) .. ( 0.3972, 0.6763) + --cycle + ( 0.5737, 0.6319) + -- ( 0.5485, 0.6258) + .. controls ( 0.5516, 0.6201) and ( 0.5520, 0.6138) .. ( 0.5614, 0.6043) + .. controls ( 0.6074, 0.5569) and ( 0.6453, 0.6371) .. ( 0.5737, 0.6319) + --cycle + (-0.6211, 0.6305) + -- (-0.6755, 0.5370) + -- (-0.6787, 0.5166) + .. controls (-0.6809, 0.5180) and (-0.6832, 0.5188) .. (-0.6854, 0.5203) + -- (-0.7191, 0.4623) + -- (-0.7291, 0.4073) + .. controls (-0.7367, 0.4126) and (-0.7403, 0.4136) .. (-0.7456, 0.4169) + -- (-0.7651, 0.3834) + .. controls (-0.7455, 0.3798) and (-0.7239, 0.3727) .. (-0.7052, 0.3845) + .. controls (-0.6739, 0.3993) and (-0.6763, 0.4662) .. (-0.6703, 0.4998) + .. controls (-0.6178, 0.4665) and (-0.6044, 0.4826) .. (-0.5611, 0.5204) + .. controls (-0.5440, 0.5353) and (-0.5267, 0.5491) .. (-0.5345, 0.5748) + .. controls (-0.5466, 0.6149) and (-0.5841, 0.6243) .. (-0.6211, 0.6305) + --cycle + (-0.6450, 0.5670) + -- (-0.5862, 0.5670) + .. controls (-0.6029, 0.5328) and (-0.6086, 0.5274) .. (-0.6450, 0.5166) + --cycle + ( 0.5940, 0.5141) + .. controls ( 0.5876, 0.5135) and ( 0.5814, 0.5119) .. ( 0.5737, 0.5105) + .. controls ( 0.5529, 0.5005) and ( 0.5203, 0.4878) .. ( 0.5123, 0.4644) + .. controls ( 0.5022, 0.4349) and ( 0.5312, 0.3332) .. ( 0.5982, 0.3551) + .. controls ( 0.6173, 0.3612) and ( 0.6614, 0.3963) .. ( 0.6651, 0.4168) + .. controls ( 0.6700, 0.4432) and ( 0.6406, 0.5019) .. ( 0.6149, 0.5105) + .. controls ( 0.6066, 0.5139) and ( 0.6003, 0.5146) .. ( 0.5940, 0.5141) + --cycle + ( 0.0525, 0.5036) + .. controls ( 0.0223, 0.5016) and ( 0.0014, 0.4715) .. (-0.0147, 0.4493) + .. controls (-0.0480, 0.4823) and (-0.1271, 0.5502) .. (-0.1240, 0.4493) + -- (-0.0819, 0.4661) + .. controls (-0.0631, 0.4289) and ( 0.0054, 0.3259) .. ( 0.0443, 0.3176) + .. controls ( 0.1031, 0.3051) and ( 0.1431, 0.3862) .. ( 0.0694, 0.3989) + .. controls ( 0.0551, 0.3118) and ( 0.0044, 0.4056) .. ( 0.0316, 0.4326) + .. controls ( 0.0741, 0.4748) and ( 0.1233, 0.3699) .. ( 0.1388, 0.4261) + .. controls ( 0.1477, 0.4584) and ( 0.0813, 0.5057) .. ( 0.0525, 0.5036) + --cycle + ( 0.6073, 0.4745) + -- ( 0.6242, 0.4241) + -- ( 0.5569, 0.3989) + -- ( 0.5569, 0.4493) + --cycle + (-0.3498, 0.4626) + .. controls (-0.3744, 0.4586) and (-0.3998, 0.4069) .. (-0.3941, 0.3847) + .. controls (-0.3893, 0.3661) and (-0.3650, 0.3651) .. (-0.3503, 0.3798) + -- (-0.3257, 0.4157) + .. controls (-0.3295, 0.3698) and (-0.2940, 0.3485) .. (-0.2697, 0.3592) + .. controls (-0.2492, 0.3684) and (-0.2611, 0.3898) .. (-0.2697, 0.4024) + .. controls (-0.2865, 0.4277) and (-0.3149, 0.4682) .. (-0.3498, 0.4626) + --cycle + ( 0.7488, 0.4472) + .. controls ( 0.7446, 0.4429) and ( 0.7413, 0.4378) .. ( 0.7395, 0.4315) + .. controls ( 0.7338, 0.4111) and ( 0.7612, 0.3277) .. ( 0.8087, 0.3352) + .. controls ( 0.8094, 0.3354) and ( 0.8102, 0.3361) .. ( 0.8109, 0.3364) + --cycle + (-0.1492, 0.4409) + .. controls (-0.1577, 0.3701) and (-0.1298, 0.3577) .. (-0.0651, 0.3568) + .. controls (-0.0461, 0.3027) and (-0.0025, 0.3462) .. (-0.0567, 0.3652) + -- (-0.0567, 0.3568) + -- (-0.0651, 0.3652) + -- (-0.0567, 0.3652) + -- (-0.0567, 0.3989) + -- (-0.0988, 0.3905) + .. controls (-0.1116, 0.4252) and (-0.1112, 0.4344) .. (-0.1492, 0.4409) + --cycle + ( 0.2869, 0.4351) + .. controls ( 0.2475, 0.4293) and ( 0.2234, 0.3681) .. ( 0.2795, 0.3485) + -- ( 0.3048, 0.3905) + .. controls ( 0.3028, 0.3760) and ( 0.3013, 0.3442) .. ( 0.3278, 0.3583) + .. controls ( 0.3557, 0.3731) and ( 0.3437, 0.4227) .. ( 0.3046, 0.4338) + .. controls ( 0.2985, 0.4356) and ( 0.2925, 0.4359) .. ( 0.2869, 0.4351) + --cycle + (-0.5352, 0.4038) + .. controls (-0.5519, 0.4042) and (-0.5689, 0.3932) .. (-0.5778, 0.3652) + -- (-0.5358, 0.3652) + -- (-0.5442, 0.3149) + -- (-0.6030, 0.3401) + .. controls (-0.6099, 0.3078) and (-0.5933, 0.2580) .. (-0.5523, 0.2636) + .. controls (-0.5251, 0.2673) and (-0.4980, 0.3070) .. (-0.4910, 0.3316) + .. controls (-0.4799, 0.3705) and (-0.5072, 0.4030) .. (-0.5352, 0.4038) + --cycle + ( 0.4056, 0.3989) + .. controls ( 0.4011, 0.3650) and ( 0.4064, 0.3627) .. ( 0.4392, 0.3568) + .. controls ( 0.4340, 0.3865) and ( 0.4336, 0.3876) .. ( 0.4056, 0.3989) + --cycle + (-0.2248, 0.3737) + -- (-0.2164, 0.3401) + -- (-0.1828, 0.3568) + --cycle + ( 0.4558, 0.3414) + .. controls ( 0.4424, 0.3419) and ( 0.4339, 0.3363) .. ( 0.4224, 0.3316) + -- ( 0.4340, 0.2885) + .. controls ( 0.4635, 0.2154) and ( 0.5405, 0.3381) .. ( 0.4558, 0.3414) + --cycle + (-0.3179, 0.3382) + .. controls (-0.3270, 0.3401) and (-0.3357, 0.3403) .. (-0.3425, 0.3381) + .. controls (-0.3762, 0.3275) and (-0.3957, 0.2970) .. (-0.4013, 0.2644) + -- (-0.3341, 0.2892) + .. controls (-0.3207, 0.2121) and (-0.2456, 0.2402) .. (-0.2545, 0.2892) + .. controls (-0.2586, 0.3110) and (-0.2906, 0.3324) .. (-0.3179, 0.3382) + --cycle + ( 0.3611, 0.3359) + .. controls ( 0.3110, 0.3372) and ( 0.2179, 0.3015) .. ( 0.2626, 0.2392) + -- ( 0.2207, 0.2056) + -- ( 0.2123, 0.2308) + -- ( 0.1955, 0.2308) + .. controls ( 0.1691, 0.1342) and ( 0.2461, 0.1660) .. ( 0.2711, 0.1678) + .. controls ( 0.3105, 0.1704) and ( 0.3525, 0.1635) .. ( 0.3836, 0.2013) + .. controls ( 0.4000, 0.2213) and ( 0.3935, 0.2469) .. ( 0.3552, 0.2434) + .. controls ( 0.3256, 0.2408) and ( 0.3193, 0.2282) .. ( 0.3048, 0.2056) + .. controls ( 0.2927, 0.2510) and ( 0.2970, 0.2476) .. ( 0.3131, 0.2897) + -- ( 0.3552, 0.2728) + -- ( 0.3636, 0.2980) + -- ( 0.3719, 0.2644) + .. controls ( 0.4287, 0.2825) and ( 0.4092, 0.3226) .. ( 0.3795, 0.3331) + .. controls ( 0.3746, 0.3349) and ( 0.3683, 0.3357) .. ( 0.3611, 0.3359) + --cycle + (-0.7326, 0.3304) + .. controls (-0.7558, 0.2996) and (-0.7303, 0.2839) .. (-0.7147, 0.2917) + .. controls (-0.6982, 0.3000) and (-0.6941, 0.3349) .. (-0.7326, 0.3304) + --cycle + ( 0.5316, 0.3064) + .. controls ( 0.5417, 0.2779) and ( 0.5439, 0.2772) .. ( 0.5737, 0.2813) + .. controls ( 0.5591, 0.3056) and ( 0.5600, 0.3049) .. ( 0.5316, 0.3064) + --cycle + ( 0.7063, 0.2870) + .. controls ( 0.6995, 0.2880) and ( 0.6923, 0.2874) .. ( 0.6840, 0.2844) + .. controls ( 0.6531, 0.2731) and ( 0.6307, 0.2270) .. ( 0.6242, 0.1972) + -- ( 0.6914, 0.2056) + -- ( 0.6914, 0.2475) + -- ( 0.7166, 0.2139) + -- ( 0.7670, 0.2224) + -- ( 0.7670, 0.1887) + -- ( 0.8091, 0.1804) + -- ( 0.7755, 0.1047) + -- ( 0.8343, 0.1131) + .. controls ( 0.8409, 0.1435) and ( 0.8409, 0.1473) .. ( 0.8679, 0.1636) + .. controls ( 0.8652, 0.1490) and ( 0.8470, 0.0581) .. ( 0.8896, 0.0809) + .. controls ( 0.9211, 0.0965) and ( 0.9103, 0.1720) .. ( 0.8896, 0.1909) + .. controls ( 0.8668, 0.2094) and ( 0.8421, 0.2029) .. ( 0.8174, 0.1972) + .. controls ( 0.8135, 0.2098) and ( 0.8137, 0.2162) .. ( 0.8041, 0.2272) + .. controls ( 0.7922, 0.2408) and ( 0.7748, 0.2458) .. ( 0.7601, 0.2552) + .. controls ( 0.7419, 0.2667) and ( 0.7266, 0.2841) .. ( 0.7063, 0.2870) + --cycle + ( 0.6242, 0.1972) + .. controls ( 0.6061, 0.1985) and ( 0.5845, 0.2023) .. ( 0.5690, 0.1902) + .. controls ( 0.5426, 0.1695) and ( 0.5550, 0.1248) .. ( 0.5909, 0.1110) + .. controls ( 0.6168, 0.1011) and ( 0.6421, 0.1125) .. ( 0.6679, 0.1215) + .. controls ( 0.6663, 0.1076) and ( 0.6658, 0.0850) .. ( 0.6679, 0.0720) + .. controls ( 0.6961,-0.0135) and ( 0.8163, 0.0895) .. ( 0.7250, 0.1215) + -- ( 0.6998, 0.0795) + -- ( 0.7166, 0.1299) + -- ( 0.6830, 0.1804) + -- ( 0.6578, 0.1636) + --cycle + ( 0.0950, 0.2671) + .. controls ( 0.0367, 0.2427) and ( 0.0851, 0.1985) .. ( 0.1112, 0.2040) + .. controls ( 0.1427, 0.2110) and ( 0.1597, 0.2672) .. ( 0.0950, 0.2671) + --cycle + (-0.0988, 0.2609) + .. controls (-0.1426, 0.2672) and (-0.2761, 0.1879) .. (-0.1828, 0.1551) + -- (-0.1743, 0.1972) + -- (-0.1240, 0.1804) + -- (-0.0904, 0.2308) + -- (-0.1071, 0.1720) + .. controls (-0.0221, 0.1543) and (-0.0435, 0.2528) .. (-0.0988, 0.2609) + --cycle + (-0.8142, 0.2071) + .. controls (-0.8258, 0.2070) and (-0.8375, 0.2012) .. (-0.8466, 0.1869) + .. controls (-0.8534, 0.1760) and (-0.8533, 0.1669) .. (-0.8551, 0.1551) + -- (-0.7963, 0.1636) + -- (-0.8132, 0.1215) + .. controls (-0.8020, 0.1234) and (-0.7923, 0.1232) .. (-0.7821, 0.1301) + .. controls (-0.7447, 0.1557) and (-0.7793, 0.2072) .. (-0.8142, 0.2071) + --cycle + (-0.2584, 0.2056) + -- (-0.2584, 0.1636) + .. controls (-0.2445, 0.1848) and (-0.2445, 0.1843) .. (-0.2584, 0.2056) + --cycle + (-0.7132, 0.1953) + .. controls (-0.7373, 0.1910) and (-0.7568, 0.1647) .. (-0.7459, 0.1215) + -- (-0.6955, 0.1551) + .. controls (-0.7015, 0.1043) and (-0.7057, 0.0835) .. (-0.6450, 0.0963) + -- (-0.6535, 0.0711) + .. controls (-0.5898, 0.0580) and (-0.5907, 0.1071) .. (-0.6081, 0.1249) + .. controls (-0.6203, 0.1374) and (-0.6375, 0.1370) .. (-0.6535, 0.1383) + .. controls (-0.6607, 0.1823) and (-0.6892, 0.1997) .. (-0.7132, 0.1953) + --cycle + (-0.4097, 0.1720) + -- (-0.3845, 0.1215) + -- (-0.4097, 0.0963) + -- (-0.4349, 0.1047) + .. controls (-0.4598,-0.0134) and (-0.2772, 0.1076) .. (-0.3690, 0.1621) + .. controls (-0.3821, 0.1699) and (-0.3951, 0.1703) .. (-0.4097, 0.1720) + --cycle + ( 0.4374, 0.1711) + .. controls ( 0.4200, 0.1682) and ( 0.4016, 0.1543) .. ( 0.3888, 0.1299) + -- ( 0.4477, 0.1299) + .. controls ( 0.4703, 0.1056) and ( 0.4891, 0.1252) .. ( 0.4798, 0.1463) + .. controls ( 0.4711, 0.1661) and ( 0.4548, 0.1741) .. ( 0.4374, 0.1711) + --cycle + (-0.4594, 0.1707) + .. controls (-0.4648, 0.1719) and (-0.4705, 0.1718) .. (-0.4752, 0.1698) + .. controls (-0.4878, 0.1646) and (-0.4954, 0.1508) .. (-0.4982, 0.1382) + .. controls (-0.5096, 0.0875) and (-0.4448, 0.0609) .. (-0.4602, 0.1299) + .. controls (-0.4304, 0.1504) and (-0.4433, 0.1669) .. (-0.4594, 0.1707) + --cycle + (-0.0230, 0.1592) + .. controls (-0.0727, 0.1609) and (-0.0799, 0.1002) .. (-0.1492, 0.0795) + -- (-0.1576, 0.0374) + .. controls (-0.1940, 0.0779) and (-0.1965, 0.0894) .. (-0.2500, 0.0711) + -- (-0.2584, 0.0795) + -- (-0.2332, 0.1383) + .. controls (-0.2779, 0.1347) and (-0.3158, 0.0997) .. (-0.2855, 0.0563) + .. controls (-0.2695, 0.0332) and (-0.2481, 0.0337) .. (-0.2256, 0.0248) + .. controls (-0.1803, 0.0069) and (-0.1541,-0.0311) .. (-0.1155, 0.0290) + .. controls (-0.0607, 0.0067) and (-0.0553,-0.0150) .. (-0.0307,-0.0232) + .. controls ( 0.0157,-0.0389) and ( 0.0524, 0.0035) .. ( 0.0442, 0.0543) + .. controls ( 0.0843, 0.0613) and ( 0.1010, 0.0937) .. ( 0.0727, 0.1263) + .. controls ( 0.0598, 0.1414) and (-0.0030, 0.1586) .. (-0.0230, 0.1592) + --cycle + (-0.0230, 0.1215) + -- ( 0.0442, 0.1131) + .. controls ( 0.0289, 0.0705) and ( 0.0228, 0.0356) .. (-0.0230, 0.0207) + .. controls (-0.0339, 0.0543) and (-0.0383, 0.0572) .. (-0.0735, 0.0543) + -- (-0.0819, 0.0627) + --cycle + (-0.8973, 0.1131) + .. controls (-0.9051, 0.0492) and (-0.8679, 0.0676) .. (-0.8321, 0.0457) + .. controls (-0.7996, 0.0258) and (-0.7906,-0.0272) .. (-0.7039,-0.0046) + .. controls (-0.6977,-0.0167) and (-0.6964,-0.0237) .. (-0.6846,-0.0331) + .. controls (-0.6146,-0.0891) and (-0.5741, 0.0485) .. (-0.6619, 0.0396) + .. controls (-0.6723, 0.0384) and (-0.6856, 0.0326) .. (-0.6955, 0.0290) + .. controls (-0.7145, 0.0487) and (-0.7442, 0.0435) .. (-0.7712, 0.0459) + -- (-0.7771, 0.0746) + --cycle + ( 0.7839, 0.0627) + .. controls ( 0.7798, 0.0513) and ( 0.7748, 0.0421) .. ( 0.7752, 0.0292) + .. controls ( 0.7776,-0.0409) and ( 0.8888, 0.0073) .. ( 0.8169, 0.0493) + .. controls ( 0.8064, 0.0555) and ( 0.7952, 0.0587) .. ( 0.7839, 0.0627) + --cycle + ( 0.6399, 0.0543) + .. controls ( 0.6341, 0.0555) and ( 0.6275, 0.0553) .. ( 0.6207, 0.0536) + .. controls ( 0.5899, 0.0092) and ( 0.6489,-0.0145) .. ( 0.6606, 0.0149) + .. controls ( 0.6690, 0.0359) and ( 0.6576, 0.0510) .. ( 0.6399, 0.0543) + --cycle + ( 0.2228, 0.0528) + .. controls ( 0.1887, 0.0319) and ( 0.2131,-0.0076) .. ( 0.2361,-0.0078) + .. controls ( 0.2619,-0.0080) and ( 0.2726, 0.0432) .. ( 0.2228, 0.0528) + --cycle + ( 0.4509, 0.0479) + .. controls ( 0.4394, 0.0460) and ( 0.4290, 0.0332) .. ( 0.4224, 0.0038) + .. controls ( 0.3826, 0.0304) and ( 0.3797, 0.0371) .. ( 0.3300, 0.0301) + .. controls ( 0.3175, 0.0283) and ( 0.3021, 0.0266) .. ( 0.2915, 0.0192) + .. controls ( 0.2691, 0.0036) and ( 0.2444,-0.0690) .. ( 0.3552,-0.0718) + -- ( 0.3131,-0.0046) + .. controls ( 0.3436,-0.0165) and ( 0.3418,-0.0171) .. ( 0.3719,-0.0046) + .. controls ( 0.3961,-0.0513) and ( 0.4113,-0.0431) .. ( 0.4560,-0.0298) + -- ( 0.4560, 0.0038) + -- ( 0.4812,-0.0466) + .. controls ( 0.4281,-0.0863) and ( 0.4953,-0.1091) .. ( 0.5137,-0.0706) + .. controls ( 0.5296,-0.0376) and ( 0.4853, 0.0538) .. ( 0.4509, 0.0479) + --cycle + (-0.9381, 0.0440) + .. controls (-0.9573, 0.0465) and (-0.9752, 0.0361) .. (-0.9800, 0.0016) + -- (-0.9774,-0.0032) + -- (-0.9308, 0.0123) + .. controls (-0.9260, 0.0012) and (-0.9218,-0.0135) .. (-0.9103,-0.0200) + .. controls (-0.8939,-0.0290) and (-0.8783,-0.0112) .. (-0.8895, 0.0115) + .. controls (-0.8962, 0.0252) and (-0.9176, 0.0414) .. (-0.9381, 0.0440) + --cycle + ( 0.9435, 0.0207) + -- ( 0.9184, 0.0123) + -- ( 0.9435,-0.0046) + --cycle + ( 0.8999,-0.0129) + .. controls ( 0.9000,-0.0216) and ( 0.8974,-0.0282) .. ( 0.8999,-0.0376) + .. controls ( 0.9043,-0.0955) and ( 0.9800,-0.0453) .. ( 0.9254,-0.0191) + .. controls ( 0.9173,-0.0151) and ( 0.9098,-0.0148) .. ( 0.8999,-0.0129) + --cycle + (-0.5187,-0.0249) + .. controls (-0.5448,-0.0284) and (-0.5586,-0.0592) .. (-0.5611,-0.0886) + -- (-0.5022,-0.0718) + .. controls (-0.5038,-0.1199) and (-0.4832,-0.1244) .. (-0.4434,-0.1054) + -- (-0.4349,-0.1139) + -- (-0.5106,-0.1811) + -- (-0.5442,-0.1475) + -- (-0.5274,-0.1139) + .. controls (-0.5482,-0.1103) and (-0.5717,-0.1068) .. (-0.5806,-0.1326) + .. controls (-0.5943,-0.1714) and (-0.5235,-0.2179) .. (-0.5014,-0.2194) + .. controls (-0.4612,-0.2223) and (-0.4187,-0.1658) .. (-0.4108,-0.1306) + .. controls (-0.4075,-0.1185) and (-0.4054,-0.1026) .. (-0.4108,-0.0911) + .. controls (-0.4193,-0.0753) and (-0.4422,-0.0688) .. (-0.4571,-0.0576) + -- (-0.4884,-0.0315) + .. controls (-0.4999,-0.0256) and (-0.5100,-0.0237) .. (-0.5187,-0.0249) + --cycle + ( 0.2098,-0.0382) + .. controls ( 0.1959,-0.0434) and ( 0.1851,-0.0663) .. ( 0.1925,-0.0882) + .. controls ( 0.2035,-0.1206) and ( 0.2830,-0.1639) .. ( 0.2964,-0.0882) + .. controls ( 0.2773,-0.0896) and ( 0.2586,-0.0934) .. ( 0.2447,-0.0768) + .. controls ( 0.2363,-0.0666) and ( 0.2352,-0.0463) .. ( 0.2242,-0.0396) + .. controls ( 0.2194,-0.0367) and ( 0.2145,-0.0365) .. ( 0.2098,-0.0382) + --cycle + (-0.2960,-0.0452) + .. controls (-0.3231,-0.0465) and (-0.3530,-0.0602) .. (-0.3592,-0.0683) + .. controls (-0.3758,-0.0903) and (-0.3560,-0.1221) .. (-0.3845,-0.1979) + -- (-0.4013,-0.1727) + -- (-0.4182,-0.1727) + .. controls (-0.4336,-0.2291) and (-0.4124,-0.2782) .. (-0.3803,-0.2577) + .. controls (-0.3601,-0.2446) and (-0.3538,-0.2099) .. (-0.3392,-0.1970) + .. controls (-0.3137,-0.1743) and (-0.2596,-0.2064) .. (-0.2752,-0.1306) + -- (-0.3257,-0.1558) + -- (-0.3341,-0.1475) + -- (-0.3341,-0.0970) + -- (-0.2500,-0.0970) + .. controls (-0.2447,-0.0551) and (-0.2689,-0.0439) .. (-0.2960,-0.0452) + --cycle + ( 0.6563,-0.0662) + .. controls ( 0.6458,-0.0662) and ( 0.6374,-0.0668) .. ( 0.6332,-0.0685) + .. controls ( 0.5970,-0.0835) and ( 0.6057,-0.1189) .. ( 0.6332,-0.1391) + -- ( 0.6493,-0.0970) + -- ( 0.6662,-0.0970) + .. controls ( 0.6850,-0.1248) and ( 0.6940,-0.1204) .. ( 0.7250,-0.1139) + -- ( 0.7081,-0.1475) + .. controls ( 0.7837,-0.1829) and ( 0.7876,-0.1033) .. ( 0.7490,-0.0804) + .. controls ( 0.7374,-0.0735) and ( 0.6877,-0.0664) .. ( 0.6563,-0.0662) + --cycle + ( 0.7081,-0.1475) + .. controls ( 0.6742,-0.1429) and ( 0.6720,-0.1483) .. ( 0.6662,-0.1811) + .. controls ( 0.6162,-0.1289) and ( 0.6115,-0.1833) .. ( 0.6244,-0.2044) + .. controls ( 0.6426,-0.2346) and ( 0.6823,-0.2320) .. ( 0.7016,-0.2044) + .. controls ( 0.7147,-0.1858) and ( 0.7107,-0.1681) .. ( 0.7081,-0.1475) + --cycle + ( 0.0544,-0.0769) + .. controls ( 0.0466,-0.0773) and ( 0.0382,-0.0797) .. ( 0.0297,-0.0845) + -- (-0.0147,-0.1139) + .. controls (-0.0057,-0.1396) and (-0.0069,-0.1385) .. ( 0.0189,-0.1475) + .. controls (-0.0074,-0.2147) and ( 0.0346,-0.2081) .. ( 0.0553,-0.1870) + .. controls ( 0.0667,-0.1752) and ( 0.0961,-0.1299) .. ( 0.0958,-0.1139) + .. controls ( 0.0955,-0.0925) and ( 0.0776,-0.0759) .. ( 0.0544,-0.0769) + --cycle + ( 0.3572,-0.0881) + .. controls ( 0.3447,-0.0867) and ( 0.3392,-0.1053) .. ( 0.3450,-0.1208) + .. controls ( 0.3587,-0.1579) and ( 0.4169,-0.1493) .. ( 0.4239,-0.1208) + .. controls ( 0.4287,-0.1010) and ( 0.4113,-0.0745) .. ( 0.3888,-0.0970) + -- ( 0.3719,-0.0970) + .. controls ( 0.3663,-0.0912) and ( 0.3613,-0.0886) .. ( 0.3572,-0.0881) + --cycle + ( 0.7250,-0.1054) + -- ( 0.7333,-0.1054) + -- ( 0.7333,-0.1139) + --cycle + (-0.7357,-0.1221) + .. controls (-0.7405,-0.1203) and (-0.7472,-0.1201) .. (-0.7562,-0.1227) + .. controls (-0.7721,-0.1527) and (-0.7463,-0.1606) .. (-0.7339,-0.1532) + .. controls (-0.7244,-0.1475) and (-0.7214,-0.1275) .. (-0.7357,-0.1221) + --cycle + (-0.8606,-0.1378) + .. controls (-0.8718,-0.1386) and (-0.8832,-0.1446) .. (-0.8941,-0.1518) + -- (-0.8728,-0.1897) + -- (-0.8468,-0.1811) + -- (-0.8613,-0.2102) + -- (-0.8317,-0.2631) + .. controls (-0.7953,-0.2270) and (-0.7967,-0.1536) .. (-0.8471,-0.1391) + .. controls (-0.8514,-0.1378) and (-0.8560,-0.1374) .. (-0.8606,-0.1378) + --cycle + ( 0.9187,-0.1555) + .. controls ( 0.9083,-0.1585) and ( 0.8971,-0.1627) .. ( 0.8847,-0.1675) + .. controls ( 0.8669,-0.1743) and ( 0.8469,-0.1785) .. ( 0.8399,-0.1989) + .. controls ( 0.8307,-0.2247) and ( 0.8481,-0.2329) .. ( 0.8679,-0.2399) + -- ( 0.8847,-0.2063) + .. controls ( 0.8863,-0.2068) and ( 0.8871,-0.2069) .. ( 0.8886,-0.2074) + --cycle + ( 0.8679,-0.2399) + .. controls ( 0.8663,-0.2432) and ( 0.8651,-0.2468) .. ( 0.8637,-0.2502) + -- ( 0.8693,-0.2405) + .. controls ( 0.8687,-0.2402) and ( 0.8685,-0.2401) .. ( 0.8679,-0.2399) + --cycle + ( 0.4392,-0.1558) + -- ( 0.4332,-0.1807) + .. controls ( 0.4281,-0.2431) and ( 0.5089,-0.2120) .. ( 0.4618,-0.1688) + .. controls ( 0.4519,-0.1597) and ( 0.4457,-0.1593) .. ( 0.4392,-0.1558) + --cycle + (-0.6846,-0.1952) + .. controls (-0.6966,-0.1951) and (-0.7082,-0.2013) .. (-0.7157,-0.2171) + .. controls (-0.7203,-0.2268) and (-0.7199,-0.2378) .. (-0.7207,-0.2483) + -- (-0.6787,-0.2399) + -- (-0.6703,-0.2735) + .. controls (-0.6096,-0.2523) and (-0.6488,-0.1955) .. (-0.6846,-0.1952) + --cycle + (-0.1120,-0.2035) + .. controls (-0.1188,-0.2048) and (-0.1255,-0.2071) .. (-0.1323,-0.2089) + .. controls (-0.1785,-0.2217) and (-0.2021,-0.2285) .. (-0.1912,-0.2819) + -- (-0.0988,-0.2483) + -- (-0.0651,-0.2740) + .. controls (-0.0333,-0.3228) and (-0.0165,-0.2917) .. (-0.0209,-0.2740) + .. controls (-0.0243,-0.2616) and (-0.0384,-0.2481) .. (-0.0474,-0.2386) + .. controls (-0.0590,-0.2264) and (-0.0744,-0.2085) .. (-0.0911,-0.2040) + .. controls (-0.0982,-0.2021) and (-0.1052,-0.2023) .. (-0.1120,-0.2035) + --cycle + ( 0.1647,-0.2053) + .. controls ( 0.1471,-0.2058) and ( 0.1297,-0.2092) .. ( 0.1164,-0.2148) + .. controls ( 0.0833,-0.2632) and ( 0.1207,-0.3872) .. ( 0.1933,-0.3346) + .. controls ( 0.2031,-0.3275) and ( 0.2109,-0.3165) .. ( 0.2178,-0.3068) + .. controls ( 0.2722,-0.2297) and ( 0.2177,-0.2039) .. ( 0.1647,-0.2053) + --cycle + ( 0.3262,-0.2328) + .. controls ( 0.3073,-0.2617) and ( 0.3314,-0.2707) .. ( 0.3420,-0.2638) + .. controls ( 0.3522,-0.2572) and ( 0.3585,-0.2285) .. ( 0.3262,-0.2328) + --cycle + ( 0.1534,-0.2399) + -- ( 0.2039,-0.2483) + -- ( 0.1534,-0.2987) + --cycle + ( 0.5217,-0.2636) + .. controls ( 0.5071,-0.2632) and ( 0.4918,-0.2708) .. ( 0.4798,-0.2909) + .. controls ( 0.4713,-0.3051) and ( 0.4736,-0.3094) .. ( 0.4728,-0.3240) + -- ( 0.4812,-0.3240) + -- ( 0.4812,-0.3324) + -- ( 0.5232,-0.2987) + -- ( 0.5232,-0.3492) + .. controls ( 0.6028,-0.3358) and ( 0.5655,-0.2645) .. ( 0.5217,-0.2636) + --cycle + ( 0.4812,-0.3324) + -- ( 0.4728,-0.3240) + .. controls ( 0.4525,-0.3209) and ( 0.4056,-0.3074) .. ( 0.3892,-0.3106) + .. controls ( 0.3596,-0.3163) and ( 0.3503,-0.3437) .. ( 0.3892,-0.3660) + -- ( 0.3972,-0.3407) + .. controls ( 0.4281,-0.3611) and ( 0.4279,-0.3612) .. ( 0.4644,-0.3576) + -- ( 0.4560,-0.4080) + .. controls ( 0.5104,-0.3986) and ( 0.5053,-0.3736) .. ( 0.4812,-0.3324) + --cycle + ( 0.7282,-0.2775) + .. controls ( 0.7176,-0.2768) and ( 0.7066,-0.2782) .. ( 0.6965,-0.2822) + .. controls ( 0.6458,-0.3532) and ( 0.7574,-0.3899) .. ( 0.7782,-0.3306) + .. controls ( 0.7887,-0.3013) and ( 0.7602,-0.2797) .. ( 0.7282,-0.2775) + --cycle + (-0.2465,-0.2903) + .. controls (-0.2987,-0.3042) and (-0.2344,-0.4071) .. (-0.2306,-0.4102) + .. controls (-0.1938,-0.4396) and (-0.1663,-0.4010) .. (-0.1299,-0.4027) + .. controls (-0.1140,-0.4034) and (-0.0666,-0.4182) .. (-0.0557,-0.3820) + .. controls (-0.0504,-0.3644) and (-0.0676,-0.3334) .. (-0.0988,-0.3744) + -- (-0.1181,-0.3407) + -- (-0.1308,-0.3168) + .. controls (-0.1675,-0.2582) and (-0.1759,-0.3435) .. (-0.1781,-0.3492) + .. controls (-0.1841,-0.3653) and (-0.1898,-0.3700) .. (-0.1996,-0.3828) + -- (-0.2164,-0.2903) + .. controls (-0.2291,-0.2881) and (-0.2389,-0.2883) .. (-0.2465,-0.2903) + --cycle + (-0.5947,-0.3156) + -- (-0.6030,-0.3407) + -- (-0.5778,-0.3240) + --cycle + (-0.0014,-0.3194) + .. controls (-0.0278,-0.3131) and (-0.0544,-0.3497) .. (-0.0058,-0.3694) + .. controls ( 0.0049,-0.3738) and ( 0.0162,-0.3735) .. ( 0.0273,-0.3744) + .. controls ( 0.0265,-0.3636) and ( 0.0269,-0.3522) .. ( 0.0223,-0.3420) + .. controls ( 0.0163,-0.3283) and ( 0.0074,-0.3214) .. (-0.0014,-0.3194) + --cycle + (-0.6508,-0.3284) + .. controls (-0.6656,-0.3290) and (-0.6816,-0.3373) .. (-0.6955,-0.3576) + .. controls (-0.7159,-0.3441) and (-0.7363,-0.3292) .. (-0.7624,-0.3378) + .. controls (-0.7705,-0.3405) and (-0.7771,-0.3450) .. (-0.7829,-0.3501) + -- (-0.7599,-0.3912) + -- (-0.7543,-0.3744) + -- (-0.6619,-0.4164) + -- (-0.6619,-0.3660) + -- (-0.6367,-0.4164) + .. controls (-0.5723,-0.3945) and (-0.6064,-0.3266) .. (-0.6508,-0.3284) + --cycle + (-0.5287,-0.3512) + .. controls (-0.5489,-0.3498) and (-0.5690,-0.3591) .. (-0.5764,-0.3751) + .. controls (-0.5966,-0.4192) and (-0.5398,-0.3912) .. (-0.5274,-0.3828) + -- (-0.5190,-0.4500) + -- (-0.5358,-0.4333) + -- (-0.5358,-0.4248) + -- (-0.5611,-0.4248) + .. controls (-0.5664,-0.4641) and (-0.5605,-0.4735) .. (-0.5442,-0.5088) + -- (-0.5274,-0.5088) + .. controls (-0.4972,-0.4701) and (-0.4647,-0.4466) .. (-0.4806,-0.3915) + .. controls (-0.4882,-0.3649) and (-0.5085,-0.3527) .. (-0.5287,-0.3512) + --cycle + ( 0.5485,-0.3594) + .. controls ( 0.5504,-0.3686) and ( 0.5513,-0.3797) .. ( 0.5560,-0.3899) + .. controls ( 0.5831,-0.4490) and ( 0.6446,-0.3809) .. ( 0.5811,-0.3594) + .. controls ( 0.5706,-0.3579) and ( 0.5594,-0.3583) .. ( 0.5485,-0.3594) + --cycle + ( 0.3311,-0.3646) + .. controls ( 0.3201,-0.3659) and ( 0.3103,-0.3791) .. ( 0.3084,-0.3917) + .. controls ( 0.3035,-0.4255) and ( 0.3481,-0.5315) .. ( 0.4140,-0.4669) + .. controls ( 0.4439,-0.4932) and ( 0.4962,-0.5278) .. ( 0.5388,-0.5107) + .. controls ( 0.5684,-0.4989) and ( 0.5806,-0.4516) .. ( 0.5232,-0.4333) + -- ( 0.5232,-0.4669) + .. controls ( 0.4932,-0.4550) and ( 0.4949,-0.4563) .. ( 0.4644,-0.4669) + -- ( 0.4560,-0.4248) + -- ( 0.4224,-0.4417) + -- ( 0.3888,-0.4080) + -- ( 0.3617,-0.4500) + -- ( 0.3617,-0.4080) + .. controls ( 0.3546,-0.3735) and ( 0.3422,-0.3632) .. ( 0.3311,-0.3646) + --cycle + ( 0.0862,-0.3828) + .. controls ( 0.0086,-0.4104) and ( 0.1258,-0.4856) .. ( 0.1453,-0.4236) + .. controls ( 0.1495,-0.4116) and ( 0.1465,-0.4028) .. ( 0.1453,-0.3912) + -- ( 0.0946,-0.4080) + --cycle + (-0.3761,-0.4056) + .. controls (-0.4460,-0.4310) and (-0.4022,-0.4833) .. (-0.3686,-0.4756) + .. controls (-0.3385,-0.4686) and (-0.3150,-0.4102) .. (-0.3761,-0.4056) + --cycle + (-0.1407,-0.4164) + .. controls (-0.1510,-0.4360) and (-0.1606,-0.4518) .. (-0.1524,-0.4748) + .. controls (-0.1401,-0.5093) and (-0.0958,-0.5218) .. (-0.0687,-0.4961) + .. controls (-0.0363,-0.4652) and (-0.0685,-0.4086) .. (-0.0988,-0.4753) + --cycle + (-0.7345,-0.4223) + .. controls (-0.7375,-0.4223) and (-0.7393,-0.4233) .. (-0.7417,-0.4237) + -- (-0.7259,-0.4519) + -- (-0.7123,-0.4248) + .. controls (-0.7212,-0.4230) and (-0.7284,-0.4222) .. (-0.7345,-0.4223) + --cycle + (-0.6450,-0.4333) + -- (-0.6283,-0.4753) + -- (-0.6959,-0.5053) + -- (-0.6728,-0.5467) + .. controls (-0.6597,-0.5415) and (-0.6464,-0.5310) .. (-0.6353,-0.5238) + .. controls (-0.6229,-0.5161) and (-0.6029,-0.5082) .. (-0.5949,-0.4962) + .. controls (-0.5673,-0.4552) and (-0.6118,-0.4359) .. (-0.6450,-0.4333) + --cycle + ( 0.7515,-0.4421) + .. controls ( 0.7404,-0.4518) and ( 0.7330,-0.4660) .. ( 0.7289,-0.4814) + -- ( 0.7518,-0.4421) + .. controls ( 0.7518,-0.4422) and ( 0.7516,-0.4421) .. ( 0.7515,-0.4421) + --cycle + (-0.7203,-0.4618) + -- (-0.7004,-0.4973) + .. controls (-0.6944,-0.4774) and (-0.6993,-0.4695) .. (-0.7203,-0.4618) + --cycle + ( 0.1694,-0.4873) + .. controls ( 0.1182,-0.4851) and ( 0.0606,-0.5165) .. ( 0.1114,-0.5509) + .. controls ( 0.1043,-0.5681) and ( 0.0968,-0.5809) .. ( 0.1030,-0.6004) + .. controls ( 0.1160,-0.6424) and ( 0.2092,-0.6560) .. ( 0.1955,-0.5761) + -- ( 0.1450,-0.6013) + -- ( 0.1199,-0.5425) + -- ( 0.1282,-0.5341) + .. controls ( 0.1602,-0.5459) and ( 0.1584,-0.5438) .. ( 0.1871,-0.5257) + .. controls ( 0.1977,-0.5856) and ( 0.2311,-0.5564) .. ( 0.2301,-0.5337) + .. controls ( 0.2287,-0.5019) and ( 0.2002,-0.4885) .. ( 0.1694,-0.4873) + --cycle + ( 0.3143,-0.5168) + .. controls ( 0.2653,-0.5233) and ( 0.3123,-0.5809) .. ( 0.3334,-0.5398) + .. controls ( 0.3375,-0.5319) and ( 0.3370,-0.5251) .. ( 0.3384,-0.5168) + --cycle + ( 0.5821,-0.5172) + -- ( 0.5905,-0.5425) + .. controls ( 0.5223,-0.5546) and ( 0.5461,-0.6299) .. ( 0.5965,-0.6187) + .. controls ( 0.6116,-0.6153) and ( 0.6642,-0.5952) .. ( 0.6693,-0.5808) + .. controls ( 0.6859,-0.5354) and ( 0.6147,-0.5138) .. ( 0.5821,-0.5172) + --cycle + (-0.2667,-0.5315) + .. controls (-0.3091,-0.5364) and (-0.3818,-0.5868) .. (-0.3173,-0.6098) + .. controls (-0.3409,-0.7049) and (-0.2257,-0.7182) .. (-0.2332,-0.6265) + -- (-0.2752,-0.6434) + -- (-0.3173,-0.6013) + .. controls (-0.2964,-0.5962) and (-0.2716,-0.5851) .. (-0.2511,-0.5945) + .. controls (-0.2356,-0.6015) and (-0.2239,-0.6203) .. (-0.2131,-0.6252) + .. controls (-0.1929,-0.6345) and (-0.1822,-0.6134) .. (-0.1883,-0.5942) + .. controls (-0.1944,-0.5749) and (-0.2315,-0.5384) .. (-0.2508,-0.5323) + .. controls (-0.2552,-0.5310) and (-0.2606,-0.5308) .. (-0.2667,-0.5315) + --cycle + ( 0.5989,-0.5509) + -- ( 0.6073,-0.5509) + -- ( 0.6073,-0.5593) + --cycle + (-0.0485,-0.5624) + .. controls (-0.0662,-0.5623) and (-0.0842,-0.5741) .. (-0.0904,-0.6098) + -- (-0.0483,-0.6013) + .. controls (-0.0229,-0.6296) and ( 0.0007,-0.6067) .. (-0.0083,-0.5860) + .. controls (-0.0134,-0.5744) and (-0.0308,-0.5625) .. (-0.0485,-0.5624) + --cycle + (-0.4918,-0.5707) + .. controls (-0.5107,-0.5708) and (-0.5309,-0.5802) .. (-0.5442,-0.6013) + -- (-0.5778,-0.5846) + -- (-0.5862,-0.6181) + .. controls (-0.5249,-0.6353) and (-0.5439,-0.6523) .. (-0.4854,-0.6098) + -- (-0.4937,-0.6770) + -- (-0.5442,-0.6854) + -- (-0.5442,-0.7022) + .. controls (-0.4313,-0.7520) and (-0.4409,-0.6069) .. (-0.4465,-0.5962) + .. controls (-0.4550,-0.5800) and (-0.4728,-0.5707) .. (-0.4918,-0.5707) + --cycle + ( 0.3300,-0.5846) + -- ( 0.3300,-0.6098) + -- ( 0.3552,-0.6098) + -- ( 0.3552,-0.5846) + --cycle + ( 0.3726,-0.6221) + .. controls ( 0.2948,-0.6226) and ( 0.2995,-0.7351) .. ( 0.3726,-0.7632) + .. controls ( 0.4265,-0.7841) and ( 0.4818,-0.7181) .. ( 0.4056,-0.6938) + -- ( 0.3719,-0.7275) + -- ( 0.3719,-0.7027) + .. controls ( 0.3796,-0.6524) and ( 0.4200,-0.6879) .. ( 0.4450,-0.6792) + .. controls ( 0.4638,-0.6728) and ( 0.4659,-0.6470) .. ( 0.4510,-0.6352) + .. controls ( 0.4434,-0.6293) and ( 0.3843,-0.6220) .. ( 0.3726,-0.6221) + --cycle + ( 0.0022,-0.6349) + -- ( 0.0189,-0.6686) + -- ( 0.0189,-0.6349) + --cycle + (-0.1244,-0.6794) + .. controls (-0.1314,-0.6810) and (-0.1382,-0.6846) .. (-0.1441,-0.6904) + .. controls (-0.1605,-0.7066) and (-0.1526,-0.7279) .. (-0.1607,-0.7464) + -- (-0.1786,-0.7721) + .. controls (-0.1852,-0.7840) and (-0.1929,-0.8079) .. (-0.1728,-0.8122) + .. controls (-0.1636,-0.8142) and (-0.1224,-0.7844) .. (-0.1071,-0.7778) + -- (-0.1155,-0.7106) + -- (-0.0735,-0.7275) + .. controls (-0.0800,-0.6898) and (-0.1033,-0.6748) .. (-0.1244,-0.6794) + --cycle + ( 0.1863,-0.6829) + .. controls ( 0.1792,-0.6828) and ( 0.1712,-0.6837) .. ( 0.1618,-0.6854) + -- ( 0.1618,-0.7022) + -- ( 0.2123,-0.7442) + -- ( 0.1282,-0.7190) + .. controls ( 0.1336,-0.7372) and ( 0.1344,-0.7442) .. ( 0.1476,-0.7594) + .. controls ( 0.1538,-0.7664) and ( 0.1626,-0.7738) .. ( 0.1704,-0.7788) + .. controls ( 0.2127,-0.8054) and ( 0.2462,-0.7806) .. ( 0.2481,-0.7530) + .. controls ( 0.2492,-0.7403) and ( 0.2417,-0.7279) .. ( 0.2353,-0.7175) + .. controls ( 0.2199,-0.6926) and ( 0.2075,-0.6832) .. ( 0.1863,-0.6829) + --cycle + ( 0.5905,-0.6889) + .. controls ( 0.5769,-0.6869) and ( 0.5692,-0.6908) .. ( 0.5569,-0.6938) + -- ( 0.5569,-0.7106) + -- ( 0.5821,-0.7190) + .. controls ( 0.5823,-0.7234) and ( 0.5836,-0.7260) .. ( 0.5844,-0.7296) + -- ( 0.6046,-0.6948) + .. controls ( 0.6001,-0.6927) and ( 0.5958,-0.6898) .. ( 0.5905,-0.6889) + --cycle + (-0.0391,-0.7245) + .. controls (-0.0667,-0.7229) and (-0.0839,-0.7453) .. (-0.0753,-0.7947) + .. controls (-0.0651,-0.8529) and (-0.0367,-0.8483) .. (-0.0106,-0.8698) + -- ( 0.0547,-0.8704) + .. controls ( 0.0548,-0.8616) and ( 0.0567,-0.8516) .. ( 0.0610,-0.8367) + -- ( 0.0189,-0.8367) + .. controls ( 0.0024,-0.8190) and ( 0.0000,-0.8231) .. (-0.0230,-0.8283) + .. controls (-0.0380,-0.7923) and (-0.0454,-0.7840) .. (-0.0399,-0.7442) + -- (-0.0230,-0.7442) + -- (-0.0147,-0.7778) + -- ( 0.0694,-0.7778) + -- ( 0.0525,-0.8199) + -- ( 0.1424,-0.8295) + .. controls ( 0.1612,-0.8227) and ( 0.1619,-0.8006) .. ( 0.1424,-0.7877) + .. controls ( 0.1265,-0.7801) and ( 0.1112,-0.7837) .. ( 0.0946,-0.7877) + .. controls ( 0.0866,-0.7388) and ( 0.0598,-0.7228) .. ( 0.0189,-0.7526) + .. controls (-0.0021,-0.7351) and (-0.0224,-0.7255) .. (-0.0391,-0.7245) + --cycle + (-0.5605,-0.7471) + -- (-0.5242,-0.8116) + .. controls (-0.5223,-0.8116) and (-0.5211,-0.8114) .. (-0.5190,-0.8115) + -- (-0.5201,-0.8191) + -- (-0.4998,-0.8552) + .. controls (-0.4770,-0.8370) and (-0.4696,-0.8098) .. (-0.4974,-0.7815) + --cycle + (-0.3761,-0.7611) + -- (-0.3845,-0.7694) + -- (-0.3845,-0.7863) + -- (-0.3761,-0.7947) + -- (-0.3593,-0.7947) + -- (-0.3508,-0.7863) + -- (-0.3508,-0.7694) + -- (-0.3593,-0.7611) + --cycle + ( 0.3384,-0.8347) + .. controls ( 0.3106,-0.8395) and ( 0.2888,-0.8533) .. ( 0.2775,-0.8723) + -- ( 0.3442,-0.8729) + -- ( 0.3467,-0.8702) + -- ( 0.3561,-0.8730) + -- ( 0.4348,-0.8736) + .. controls ( 0.4345,-0.8731) and ( 0.4345,-0.8727) .. ( 0.4341,-0.8721) + .. controls ( 0.4186,-0.8512) and ( 0.3640,-0.8304) .. ( 0.3384,-0.8347) + --cycle + (-0.0904,-0.8535) + .. controls (-0.1018,-0.8579) and (-0.1087,-0.8586) .. (-0.1185,-0.8680) + .. controls (-0.1188,-0.8683) and (-0.1189,-0.8687) .. (-0.1192,-0.8690) + -- (-0.0904,-0.8692) + --cycle + (-0.3081,-0.8645) + .. controls (-0.3140,-0.8641) and (-0.3192,-0.8651) .. (-0.3238,-0.8672) + -- (-0.2954,-0.8675) + .. controls (-0.2996,-0.8660) and (-0.3039,-0.8648) .. (-0.3081,-0.8645) + --cycle + ; + } +} +\fi +% \end{macrocode} +% \end{TikzKey} +% \iffalse +%</hex> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/hex/terrain/mountain.dtx b/macros/latex/contrib/wargame/source/hex/terrain/mountain.dtx new file mode 100644 index 0000000000..0ea308c2f8 --- /dev/null +++ b/macros/latex/contrib/wargame/source/hex/terrain/mountain.dtx @@ -0,0 +1,26 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*hex> +% \fi +% \begin{TikzKey}{hex/terrain/mountain} +% This is an example of a terrain \spec{pic}ture. +% +% \begin{macrocode} +\tikzset{ + hex/terrain/mountain/.pic={% + \path[draw=black,fill=white] (0,0) -- (.3,.9)--(.45,0) -- cycle; + \path[draw=black,fill=lightgray,pic actions] + (-.6 ,- .9) -- + (-.3 , .3) -- + ( 0, 0) -- + ( .45, 0) -- + ( .6 , -.9) -- cycle; + } +} +% \end{macrocode} +% \end{TikzKey} +% +% \iffalse +%</hex> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/hex/terrain/mountains.dtx b/macros/latex/contrib/wargame/source/hex/terrain/mountains.dtx new file mode 100644 index 0000000000..04f935bd92 --- /dev/null +++ b/macros/latex/contrib/wargame/source/hex/terrain/mountains.dtx @@ -0,0 +1,695 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*hex> +% \fi +% \begin{TikzKey}{hex/terrain/mountains} +% The style for mountains. The pattern is filled with a darker +% brown, and outlines are not drawn. Note that the mountain pattern +% is the same as the beach pattern, just with a different colour. +% +% \begin{macrocode} +\tikzset{ + hex/terrain/mountains/.style={ + draw=none, + fill={rgb,100:red,49;green,35;blue,1} + } +} +% \end{macrocode} +% \end{TikzKey} +% +% \begin{TikzKey}{hex/terrain/mountains} +% And the mountains pattern. This is the same as the beach pattern, +% only filled with a darker brown colour. +% +% \begin{macrocode} +\ifhex@terrain@pic +\tikzset{ + hex/terrain/mountains/.pic={ + \path[hex/terrain/mountains,pic actions,draw=none] + (-0.4931, 0.8848) + -- (-0.4998, 0.8734) + .. controls (-0.4908, 0.8731) and (-0.4813, 0.8762) .. (-0.4762, 0.8847) + --cycle + (-0.4032, 0.8841) + .. controls (-0.4004, 0.8804) and (-0.3988, 0.8794) .. (-0.3956, 0.8745) + .. controls (-0.3760, 0.8443) and (-0.3811, 0.8330) .. (-0.3456, 0.8112) + .. controls (-0.3250, 0.7986) and (-0.2712, 0.7770) .. (-0.2531, 0.8032) + .. controls (-0.2294, 0.8375) and (-0.2984, 0.8503) .. (-0.3193, 0.8690) + .. controls (-0.3243, 0.8735) and (-0.3281, 0.8785) .. (-0.3321, 0.8835) + --cycle + (-0.2462, 0.8828) + .. controls (-0.2425, 0.8681) and (-0.2383, 0.8546) .. (-0.2293, 0.8461) + .. controls (-0.2102, 0.8280) and (-0.1892, 0.8390) .. (-0.1859, 0.8669) + .. controls (-0.1854, 0.8711) and (-0.1871, 0.8772) .. (-0.1875, 0.8822) + --cycle + (-0.0997, 0.8815) + .. controls (-0.0971, 0.8706) and (-0.0941, 0.8597) .. (-0.0907, 0.8493) + -- (-0.0570, 0.8578) + .. controls (-0.0570, 0.8629) and (-0.0560, 0.8730) .. (-0.0553, 0.8812) + --cycle + ( 0.0213, 0.8805) + .. controls ( 0.0222, 0.8725) and ( 0.0235, 0.8650) .. ( 0.0262, 0.8587) + .. controls ( 0.0391, 0.8281) and ( 0.0706, 0.8199) .. ( 0.0917, 0.7894) + .. controls ( 0.1112, 0.7609) and ( 0.1058, 0.7286) .. ( 0.1050, 0.6961) + -- ( 0.1731, 0.7216) + -- ( 0.1203, 0.8649) + -- ( 0.1097, 0.8797) + --cycle + ( 0.2978, 0.8781) + .. controls ( 0.2985, 0.8773) and ( 0.3002, 0.8756) .. ( 0.3008, 0.8749) + .. controls ( 0.2854, 0.8687) and ( 0.2549, 0.8572) .. ( 0.2421, 0.8487) + .. controls ( 0.2026, 0.8224) and ( 0.1905, 0.7567) .. ( 0.2046, 0.7132) + .. controls ( 0.2146, 0.6819) and ( 0.2330, 0.6680) .. ( 0.2394, 0.6280) + .. controls ( 0.2413, 0.6160) and ( 0.2468, 0.5527) .. ( 0.2446, 0.5437) + .. controls ( 0.2396, 0.5232) and ( 0.2211, 0.5122) .. ( 0.2231, 0.4913) + .. controls ( 0.2261, 0.4603) and ( 0.2686, 0.4388) .. ( 0.2891, 0.4194) + .. controls ( 0.3020, 0.4071) and ( 0.3136, 0.3895) .. ( 0.3281, 0.3799) + .. controls ( 0.3688, 0.3533) and ( 0.3905, 0.3863) .. ( 0.4199, 0.3902) + .. controls ( 0.4350, 0.3921) and ( 0.4560, 0.3849) .. ( 0.4710, 0.3812) + -- ( 0.4795, 0.4067) + -- ( 0.4965, 0.4067) + .. controls ( 0.5008, 0.3961) and ( 0.5009, 0.3893) .. ( 0.5112, 0.3811) + .. controls ( 0.5112, 0.3811) and ( 0.6172, 0.3385) .. ( 0.6481, 0.3037) + .. controls ( 0.6729, 0.2758) and ( 0.6641, 0.2532) .. ( 0.6667, 0.2206) + -- ( 0.7004, 0.2206) + .. controls ( 0.7839, 0.2118) and ( 0.7047, 0.0740) .. ( 0.7057, 0.0568) + .. controls ( 0.7067, 0.0396) and ( 0.7865,-0.0424) .. ( 0.8032,-0.0520) + .. controls ( 0.8251,-0.0644) and ( 0.8703,-0.0686) .. ( 0.8572,-0.0293) + .. controls ( 0.8518,-0.0131) and ( 0.7996, 0.0474) .. ( 0.7843, 0.0564) + .. controls ( 0.7724, 0.0633) and ( 0.7645, 0.0636) .. ( 0.7518, 0.0664) + .. controls ( 0.7688, 0.1093) and ( 0.7993, 0.1905) .. ( 0.7930, 0.2362) + .. controls ( 0.7869, 0.2804) and ( 0.7252, 0.2982) .. ( 0.6946, 0.3268) + .. controls ( 0.6664, 0.3531) and ( 0.6746, 0.3662) .. ( 0.6323, 0.3966) + .. controls ( 0.5760, 0.4371) and ( 0.5386, 0.4324) .. ( 0.5250, 0.4601) + .. controls ( 0.5090, 0.4927) and ( 0.5578, 0.6035) .. ( 0.5969, 0.5911) + .. controls ( 0.6199, 0.5839) and ( 0.6224, 0.5471) .. ( 0.6341, 0.5291) + .. controls ( 0.6488, 0.5064) and ( 0.7020, 0.4614) .. ( 0.7263, 0.4493) + -- ( 0.7373, 0.4768) + -- ( 0.6866, 0.5671) + -- ( 0.6756, 0.5720) + -- ( 0.6766, 0.5850) + -- ( 0.6331, 0.6627) + .. controls ( 0.6280, 0.6613) and ( 0.6239, 0.6599) .. ( 0.6157, 0.6589) + -- ( 0.5646, 0.6589) + .. controls ( 0.5375, 0.6557) and ( 0.5277, 0.6432) .. ( 0.4965, 0.6489) + .. controls ( 0.4716, 0.6520) and ( 0.4306, 0.6774) .. ( 0.4104, 0.6489) + .. controls ( 0.3809, 0.6093) and ( 0.4627, 0.6240) .. ( 0.4837, 0.5772) + .. controls ( 0.4958, 0.5502) and ( 0.4652, 0.4811) .. ( 0.4429, 0.4648) + -- ( 0.3523, 0.4350) + .. controls ( 0.3178, 0.4372) and ( 0.3207, 0.4766) .. ( 0.3153, 0.5004) + .. controls ( 0.3090, 0.5282) and ( 0.2968, 0.5398) .. ( 0.2922, 0.5684) + .. controls ( 0.2896, 0.6035) and ( 0.3061, 0.6276) .. ( 0.2922, 0.6621) + .. controls ( 0.2756, 0.6961) and ( 0.2422, 0.7190) .. ( 0.2525, 0.7640) + .. controls ( 0.2650, 0.8188) and ( 0.3165, 0.7932) .. ( 0.3324, 0.8417) + .. controls ( 0.3359, 0.8522) and ( 0.3385, 0.8648) .. ( 0.3399, 0.8778) + --cycle + ( 0.4261, 0.8770) + -- ( 0.4333, 0.8493) + -- ( 0.4845, 0.7440) + .. controls ( 0.4963, 0.7304) and ( 0.5450, 0.6930) .. ( 0.5630, 0.6989) + .. controls ( 0.5735, 0.7024) and ( 0.5838, 0.7169) .. ( 0.5932, 0.7337) + -- ( 0.5612, 0.7909) + .. controls ( 0.5537, 0.7875) and ( 0.5468, 0.7852) .. ( 0.5403, 0.7864) + .. controls ( 0.5078, 0.7926) and ( 0.5191, 0.8406) .. ( 0.5145, 0.8567) + .. controls ( 0.5121, 0.8651) and ( 0.5076, 0.8710) .. ( 0.5025, 0.8764) + --cycle + ( 0.3773, 0.8153) + .. controls ( 0.3625, 0.7892) and ( 0.2993, 0.7161) .. ( 0.3316, 0.6877) + .. controls ( 0.3432, 0.6774) and ( 0.3866, 0.6728) .. ( 0.4029, 0.6706) + -- ( 0.3973, 0.7472) + -- ( 0.4029, 0.8153) + --cycle + (-0.4224, 0.8088) + .. controls (-0.4416, 0.8077) and (-0.4585, 0.7826) .. (-0.4275, 0.7562) + -- (-0.3971, 0.7387) + .. controls (-0.4780, 0.6942) and (-0.4752, 0.6640) .. (-0.4591, 0.5855) + .. controls (-0.4391, 0.4887) and (-0.4527, 0.5347) .. (-0.4103, 0.4493) + .. controls (-0.3870, 0.4026) and (-0.4070, 0.3747) .. (-0.3460, 0.3642) + -- (-0.3352, 0.4823) + .. controls (-0.3409, 0.5024) and (-0.3617, 0.5113) .. (-0.3739, 0.5281) + -- (-0.4164, 0.6287) + .. controls (-0.4188, 0.6375) and (-0.4186, 0.6444) .. (-0.4164, 0.6528) + .. controls (-0.4067, 0.6807) and (-0.3521, 0.7255) .. (-0.3274, 0.6931) + .. controls (-0.3070, 0.6694) and (-0.3336, 0.6432) .. (-0.3274, 0.6221) + .. controls (-0.3249, 0.6055) and (-0.3059, 0.6028) .. (-0.2950, 0.6162) + .. controls (-0.2867, 0.6265) and (-0.2838, 0.6558) .. (-0.2829, 0.6692) + .. controls (-0.2775, 0.7444) and (-0.3333, 0.7652) .. (-0.3955, 0.7472) + .. controls (-0.3950, 0.7586) and (-0.3916, 0.7684) .. (-0.3955, 0.7803) + .. controls (-0.3986, 0.8016) and (-0.4109, 0.8096) .. (-0.4224, 0.8088) + --cycle + (-0.1391, 0.8077) + .. controls (-0.1634, 0.8024) and (-0.1582, 0.7647) .. (-0.1487, 0.7492) + .. controls (-0.1306, 0.7190) and (-0.1004, 0.7270) .. (-0.0652, 0.7073) + -- (-0.0226, 0.6801) + -- ( 0.0282, 0.6560) + .. controls ( 0.0622, 0.6331) and ( 0.0955, 0.5639) .. ( 0.1219, 0.5259) + .. controls ( 0.2125, 0.5714) and ( 0.1427, 0.6114) .. ( 0.1219, 0.6453) + -- ( 0.1054, 0.6768) + .. controls ( 0.0862, 0.7028) and ( 0.0448, 0.7080) .. ( 0.0115, 0.7299) + .. controls (-0.0377, 0.7622) and (-0.0173, 0.7726) .. (-0.0822, 0.7918) + .. controls (-0.0961, 0.7958) and (-0.1270, 0.8103) .. (-0.1391, 0.8077) + --cycle + (-0.5460, 0.7940) + -- (-0.5911, 0.7166) + .. controls (-0.5649, 0.7015) and (-0.5397, 0.7188) .. (-0.5308, 0.7556) + .. controls (-0.5251, 0.7788) and (-0.5335, 0.7873) .. (-0.5460, 0.7940) + --cycle + (-0.2382, 0.7423) + .. controls (-0.2453, 0.7424) and (-0.2512, 0.7383) .. (-0.2550, 0.7274) + .. controls (-0.2635, 0.7026) and (-0.2353, 0.6726) .. (-0.2229, 0.6536) + .. controls (-0.2031, 0.6234) and (-0.2020, 0.6105) .. (-0.1928, 0.5770) + .. controls (-0.1763, 0.5803) and (-0.1499, 0.5890) .. (-0.1342, 0.5831) + .. controls (-0.1112, 0.5745) and (-0.1047, 0.5481) .. (-0.0866, 0.5338) + -- (-0.0397, 0.5102) + -- ( 0.0664, 0.4219) + .. controls ( 0.0874, 0.3954) and ( 0.0785, 0.3655) .. ( 0.1070, 0.3502) + .. controls ( 0.1367, 0.3343) and ( 0.1690, 0.3592) .. ( 0.1732, 0.3899) + .. controls ( 0.1755, 0.4075) and ( 0.1545, 0.4554) .. ( 0.1475, 0.4748) + .. controls ( 0.0838, 0.4666) and ( 0.0509, 0.4836) .. ( 0.0454, 0.5515) + .. controls (-0.0576, 0.5778) and (-0.0955, 0.6323) .. (-0.1754, 0.6949) + .. controls (-0.1861, 0.7034) and (-0.2171, 0.7418) .. (-0.2382, 0.7423) + --cycle + (-0.5068, 0.6706) + .. controls (-0.5119, 0.6724) and (-0.5194, 0.6726) .. (-0.5299, 0.6701) + .. controls (-0.5512, 0.6413) and (-0.5242, 0.6333) .. (-0.5102, 0.6400) + .. controls (-0.4981, 0.6457) and (-0.4916, 0.6653) .. (-0.5068, 0.6706) + --cycle + (-0.6356, 0.6402) + -- (-0.6681, 0.5845) + -- (-0.6588, 0.5684) + .. controls (-0.6473, 0.5521) and (-0.6323, 0.5371) .. (-0.6265, 0.5174) + .. controls (-0.6174, 0.4865) and (-0.6614, 0.4161) .. (-0.6950, 0.4206) + .. controls (-0.7111, 0.4226) and (-0.7174, 0.4376) .. (-0.7460, 0.4507) + -- (-0.7632, 0.4212) + .. controls (-0.7629, 0.4042) and (-0.7611, 0.3875) .. (-0.7546, 0.3789) + .. controls (-0.7424, 0.3626) and (-0.7129, 0.3612) .. (-0.6966, 0.3297) + .. controls (-0.6823, 0.3022) and (-0.6963, 0.2741) .. (-0.6808, 0.2598) + .. controls (-0.6602, 0.2410) and (-0.6495, 0.2720) .. (-0.6484, 0.2878) + .. controls (-0.6461, 0.3229) and (-0.6488, 0.4046) .. (-0.6080, 0.4204) + .. controls (-0.5750, 0.4330) and (-0.4980, 0.3514) .. (-0.4929, 0.3217) + .. controls (-0.4895, 0.3019) and (-0.5044, 0.2671) .. (-0.4860, 0.2550) + .. controls (-0.4691, 0.2439) and (-0.4582, 0.2679) .. (-0.4535, 0.2796) + .. controls (-0.4450, 0.3015) and (-0.4273, 0.3562) .. (-0.4401, 0.3771) + .. controls (-0.4495, 0.3922) and (-0.5019, 0.4172) .. (-0.5296, 0.4507) + .. controls (-0.5656, 0.4941) and (-0.5734, 0.5631) .. (-0.5973, 0.6021) + .. controls (-0.6099, 0.6226) and (-0.6226, 0.6316) .. (-0.6356, 0.6402) + --cycle + ( 0.2242, 0.6110) + -- ( 0.1816, 0.6025) + -- ( 0.1816, 0.5855) + .. controls ( 0.2117, 0.5815) and ( 0.2140, 0.5821) .. ( 0.2242, 0.6110) + --cycle + ( 0.3924, 0.6049) + .. controls ( 0.3895, 0.6048) and ( 0.3860, 0.6036) .. ( 0.3820, 0.6011) + .. controls ( 0.3535, 0.5835) and ( 0.3670, 0.5238) .. ( 0.3773, 0.5004) + -- ( 0.3944, 0.5004) + -- ( 0.4061, 0.5429) + .. controls ( 0.4082, 0.5540) and ( 0.4130, 0.6056) .. ( 0.3924, 0.6049) + --cycle + (-0.2864, 0.5940) + .. controls (-0.2904, 0.5793) and (-0.2950, 0.5676) .. (-0.2919, 0.5518) + .. controls (-0.2769, 0.4768) and (-0.1616, 0.5041) .. (-0.2162, 0.5623) + .. controls (-0.2236, 0.5702) and (-0.2346, 0.5747) .. (-0.2443, 0.5790) + --cycle + (-0.7010, 0.5280) + -- (-0.7269, 0.4835) + .. controls (-0.7207, 0.4876) and (-0.7144, 0.4952) .. (-0.7081, 0.5094) + --cycle + (-0.0992, 0.4748) + -- (-0.2099, 0.4556) + -- (-0.2888, 0.3790) + -- (-0.3460, 0.3557) + -- (-0.3389, 0.3218) + .. controls (-0.3310, 0.2959) and (-0.3026, 0.2636) .. (-0.2781, 0.2927) + .. controls (-0.2745, 0.2971) and (-0.2504, 0.3947) .. (-0.1948, 0.3764) + .. controls (-0.1607, 0.3651) and (-0.1697, 0.2984) .. (-0.1588, 0.2536) + -- (-0.1503, 0.2536) + -- (-0.1503, 0.2450) + -- (-0.1163, 0.2366) + .. controls (-0.0968, 0.3059) and (-0.1262, 0.3371) .. (-0.1239, 0.3982) + .. controls (-0.1229, 0.4261) and (-0.1067, 0.4484) .. (-0.0992, 0.4748) + --cycle + (-0.1503, 0.2450) + -- (-0.1588, 0.2536) + .. controls (-0.2292, 0.2544) and (-0.2730, 0.2893) .. (-0.2677, 0.2195) + -- (-0.2609, 0.1855) + .. controls (-0.2393, 0.1890) and (-0.2005, 0.2039) .. (-0.1909, 0.1753) + .. controls (-0.1709, 0.1163) and (-0.2582, 0.0953) .. (-0.2387, 0.0533) + .. controls (-0.2275, 0.0292) and (-0.1430, 0.0537) .. (-0.1361, 0.0692) + .. controls (-0.1250, 0.0859) and (-0.1359, 0.1083) .. (-0.1361, 0.1259) + .. controls (-0.1437, 0.1788) and (-0.1186, 0.1766) .. (-0.1503, 0.2450) + --cycle + ( 0.7348, 0.4408) + .. controls ( 0.7113, 0.3774) and ( 0.7569, 0.3513) .. ( 0.7901, 0.3824) + -- ( 0.7585, 0.4390) + --cycle + ( 0.2071, 0.4153) + .. controls ( 0.1984, 0.3706) and ( 0.2118, 0.3204) .. ( 0.2582, 0.3046) + .. controls ( 0.2685, 0.3631) and ( 0.2706, 0.3931) .. ( 0.2071, 0.4153) + --cycle + (-0.0567, 0.3982) + .. controls (-0.0558, 0.3230) and (-0.0460, 0.3456) .. (-0.0210, 0.2876) + -- ( 0.0067, 0.1940) + .. controls ( 0.0180, 0.1513) and ( 0.0026, 0.1332) .. ( 0.0454, 0.1089) + -- ( 0.0767, 0.1940) + -- ( 0.0546, 0.2621) + -- ( 0.0406, 0.3185) + -- (-0.0258, 0.3896) + --cycle + (-0.7969, 0.3634) + -- (-0.8570, 0.2602) + .. controls (-0.8515, 0.2550) and (-0.8469, 0.2514) .. (-0.8414, 0.2450) + .. controls (-0.8020, 0.1990) and (-0.8201, 0.1971) .. (-0.7629, 0.1540) + .. controls (-0.7462, 0.1414) and (-0.7054, 0.1023) .. (-0.6834, 0.1181) + .. controls (-0.6662, 0.1304) and (-0.6813, 0.1625) .. (-0.6882, 0.1768) + .. controls (-0.7213, 0.2456) and (-0.7865, 0.2417) .. (-0.8004, 0.2965) + .. controls (-0.8052, 0.3154) and (-0.7990, 0.3413) .. (-0.7969, 0.3634) + --cycle + ( 0.8244, 0.3214) + .. controls ( 0.8136, 0.3128) and ( 0.8080, 0.2984) .. ( 0.8114, 0.2706) + .. controls ( 0.8314, 0.2739) and ( 0.8424, 0.2735) .. ( 0.8526, 0.2710) + --cycle + ( 0.5015, 0.3207) + .. controls ( 0.4943, 0.3196) and ( 0.4861, 0.3171) .. ( 0.4766, 0.3130) + .. controls ( 0.4611, 0.2827) and ( 0.4839, 0.2747) .. ( 0.5028, 0.2521) + -- ( 0.5376, 0.1972) + .. controls ( 0.5529, 0.1772) and ( 0.5728, 0.1698) .. ( 0.5845, 0.1426) + .. controls ( 0.5979, 0.1115) and ( 0.5837, 0.0732) .. ( 0.5987, 0.0532) + .. controls ( 0.6095, 0.0384) and ( 0.6236, 0.0428) .. ( 0.6350, 0.0532) + .. controls ( 0.6681, 0.0842) and ( 0.6456, 0.1087) .. ( 0.6482, 0.1429) + .. controls ( 0.6481, 0.1614) and ( 0.6596, 0.1802) .. ( 0.6482, 0.1967) + .. controls ( 0.6390, 0.2131) and ( 0.5992, 0.2239) .. ( 0.5768, 0.2483) + .. controls ( 0.5547, 0.2722) and ( 0.5524, 0.3288) .. ( 0.5015, 0.3207) + --cycle + (-0.5678, 0.3115) + .. controls (-0.5832, 0.3118) and (-0.6140, 0.2810) .. (-0.6269, 0.2706) + .. controls (-0.6185, 0.2412) and (-0.5926, 0.1953) .. (-0.5973, 0.1685) + .. controls (-0.6029, 0.1373) and (-0.6320, 0.1239) .. (-0.6369, 0.0996) + .. controls (-0.6406, 0.0816) and (-0.6303, 0.0652) .. (-0.6237, 0.0493) + .. controls (-0.6147, 0.0275) and (-0.6000,-0.0443) .. (-0.5641,-0.0258) + .. controls (-0.5134,-0.0018) and (-0.5902, 0.0606) .. (-0.5641, 0.1074) + .. controls (-0.5332, 0.1697) and (-0.4913, 0.1444) .. (-0.4481, 0.1593) + .. controls (-0.3913, 0.1792) and (-0.3439, 0.2446) .. (-0.3545, 0.3046) + -- (-0.4568, 0.2201) + -- (-0.5588, 0.2201) + .. controls (-0.5549, 0.2390) and (-0.5305, 0.3109) .. (-0.5678, 0.3115) + --cycle + ( 0.2243, 0.2813) + -- ( 0.1631, 0.2450) + -- ( 0.0965, 0.2281) + -- ( 0.1689, 0.1131) + -- ( 0.2065, 0.0861) + .. controls ( 0.2453, 0.0564) and ( 0.2384, 0.0410) .. ( 0.2923, 0.0323) + -- ( 0.2988,-0.0188) + .. controls ( 0.2994,-0.0695) and ( 0.2657,-0.0796) .. ( 0.2249,-0.0579) + .. controls ( 0.1337,-0.0093) and ( 0.1545, 0.0219) .. ( 0.1102, 0.0744) + .. controls ( 0.0914, 0.0967) and ( 0.0807, 0.1010) .. ( 0.0539, 0.1089) + .. controls ( 0.0562, 0.0613) and ( 0.0756,-0.0434) .. ( 0.0403,-0.0825) + .. controls ( 0.0293,-0.0948) and (-0.0336,-0.1168) .. (-0.0567,-0.1294) + .. controls (-0.0615,-0.1087) and (-0.0777,-0.0729) .. (-0.0703,-0.0546) + .. controls (-0.0586,-0.0251) and ( 0.0562, 0.0040) .. (-0.0152, 0.0389) + -- (-0.0397, 0.0480) + -- (-0.0737, 0.0578) + .. controls (-0.0806, 0.0391) and (-0.0849, 0.0192) .. (-0.1018, 0.0068) + .. controls (-0.1154,-0.0032) and (-0.1352,-0.0018) .. (-0.1438,-0.0212) + .. controls (-0.1562,-0.0491) and (-0.1117,-0.1243) .. (-0.0874,-0.1373) + .. controls (-0.0745,-0.1434) and (-0.0687,-0.1394) .. (-0.0567,-0.1373) + .. controls (-0.0358,-0.2033) and (-0.0062,-0.1612) .. ( 0.0370,-0.1500) + -- ( 0.1050,-0.1379) + .. controls ( 0.0882,-0.0871) and ( 0.0808,-0.0999) .. ( 0.0965,-0.0443) + .. controls ( 0.1454,-0.0619) and ( 0.1336,-0.0743) .. ( 0.1664,-0.0940) + .. controls ( 0.1897,-0.1081) and ( 0.2226,-0.1052) .. ( 0.2361,-0.1388) + .. controls ( 0.2495,-0.1724) and ( 0.2245,-0.1963) .. ( 0.2412,-0.2584) + .. controls ( 0.2526,-0.2569) and ( 0.2622,-0.2548) .. ( 0.2735,-0.2584) + .. controls ( 0.2987,-0.2708) and ( 0.3225,-0.3241) .. ( 0.3212,-0.3506) + .. controls ( 0.3203,-0.3711) and ( 0.3053,-0.3950) .. ( 0.3008,-0.4443) + -- ( 0.2497,-0.4187) + .. controls ( 0.2599,-0.4479) and ( 0.2621,-0.4475) .. ( 0.2905,-0.4528) + .. controls ( 0.2877,-0.4715) and ( 0.2799,-0.4998) .. ( 0.2905,-0.5182) + .. controls ( 0.2991,-0.5392) and ( 0.3228,-0.5357) .. ( 0.3346,-0.5182) + .. controls ( 0.3506,-0.4943) and ( 0.3355,-0.4515) .. ( 0.3532,-0.4203) + .. controls ( 0.3716,-0.3881) and ( 0.4096,-0.3844) .. ( 0.4084,-0.3499) + .. controls ( 0.4074,-0.3241) and ( 0.3866,-0.3087) .. ( 0.3728,-0.2897) + -- ( 0.3426,-0.2337) + -- ( 0.2989,-0.1879) + .. controls ( 0.2810,-0.1587) and ( 0.2976,-0.1327) .. ( 0.3187,-0.1323) + .. controls ( 0.3342,-0.1319) and ( 0.3489,-0.1451) .. ( 0.3603,-0.1541) + .. controls ( 0.3817,-0.1712) and ( 0.4026,-0.1894) .. ( 0.4144,-0.2146) + .. controls ( 0.4299,-0.2477) and ( 0.4289,-0.2977) .. ( 0.4712,-0.3110) + .. controls ( 0.4957,-0.3188) and ( 0.5167,-0.3024) .. ( 0.5044,-0.2753) + .. controls ( 0.4967,-0.2585) and ( 0.4769,-0.2471) .. ( 0.4676,-0.2227) + .. controls ( 0.4582,-0.1981) and ( 0.4681,-0.1743) .. ( 0.4488,-0.1492) + .. controls ( 0.4286,-0.1227) and ( 0.3809,-0.1095) .. ( 0.3621,-0.0696) + .. controls ( 0.3402,-0.0230) and ( 0.3896, 0.0270) .. ( 0.3092, 0.0408) + -- ( 0.3532, 0.1933) + -- ( 0.3944, 0.2536) + -- ( 0.3433, 0.2765) + --cycle + ( 0.2497, 0.2450) + -- ( 0.2782, 0.2025) + .. controls ( 0.2843, 0.1911) and ( 0.2884, 0.1815) .. ( 0.2900, 0.1685) + .. controls ( 0.3021, 0.0654) and ( 0.1495, 0.1479) .. ( 0.2135, 0.2245) + .. controls ( 0.2246, 0.2378) and ( 0.2346, 0.2396) .. ( 0.2497, 0.2450) + --cycle + ( 0.8836, 0.2157) + .. controls ( 0.8688, 0.2061) and ( 0.8571, 0.1889) .. ( 0.8687, 0.1736) + .. controls ( 0.8785, 0.1608) and ( 0.8967, 0.1613) .. ( 0.9161, 0.1578) + --cycle + (-0.3035, 0.1940) + .. controls (-0.3340, 0.1390) and (-0.3508, 0.1491) .. (-0.3624, 0.1300) + .. controls (-0.3738, 0.1112) and (-0.3588, 0.0896) .. (-0.3288, 0.0972) + .. controls (-0.2842, 0.1084) and (-0.2392, 0.1714) .. (-0.3035, 0.1940) + --cycle + ( 0.4710, 0.1940) + .. controls ( 0.4330, 0.1525) and ( 0.3961, 0.1447) .. ( 0.4114, 0.0833) + .. controls ( 0.4294, 0.0897) and ( 0.4596, 0.1056) .. ( 0.4776, 0.0984) + .. controls ( 0.5010, 0.0888) and ( 0.5182, 0.0420) .. ( 0.4925, 0.0231) + .. controls ( 0.4698, 0.0064) and ( 0.4500, 0.0299) .. ( 0.3944, 0.0153) + .. controls ( 0.4243,-0.0189) and ( 0.4618,-0.0333) .. ( 0.4765,-0.0621) + .. controls ( 0.4928,-0.0939) and ( 0.4729,-0.1183) .. ( 0.4881,-0.1406) + .. controls ( 0.4977,-0.1549) and ( 0.5241,-0.1630) .. ( 0.5425,-0.1894) + .. controls ( 0.5557,-0.2085) and ( 0.5562,-0.2282) .. ( 0.5657,-0.2485) + -- ( 0.6122,-0.3251) + .. controls ( 0.6335,-0.3720) and ( 0.6160,-0.3973) .. ( 0.6323,-0.4443) + .. controls ( 0.6532,-0.5042) and ( 0.6754,-0.5231) .. ( 0.6973,-0.5440) + -- ( 0.7289,-0.4899) + .. controls ( 0.7138,-0.4739) and ( 0.6992,-0.4579) .. ( 0.6886,-0.4358) + -- ( 0.6489,-0.2690) + .. controls ( 0.6485,-0.2445) and ( 0.6654,-0.2180) .. ( 0.6598,-0.2002) + .. controls ( 0.6522,-0.1752) and ( 0.6202,-0.1899) .. ( 0.5938,-0.1612) + .. controls ( 0.5619,-0.1263) and ( 0.5907,-0.0980) .. ( 0.5797,-0.0720) + .. controls ( 0.5714,-0.0525) and ( 0.5434,-0.0441) .. ( 0.5374,-0.0184) + .. controls ( 0.5319, 0.0056) and ( 0.5522, 0.0300) .. ( 0.5533, 0.0578) + .. controls ( 0.5548, 0.0943) and ( 0.4981, 0.1701) .. ( 0.4710, 0.1940) + --cycle + (-0.9001, 0.1862) + -- (-0.9386, 0.1201) + .. controls (-0.9374, 0.1181) and (-0.9371, 0.1158) .. (-0.9356, 0.1139) + .. controls (-0.9242, 0.0996) and (-0.9046, 0.0893) .. (-0.8911, 0.0660) + .. controls (-0.8684, 0.0268) and (-0.8960, 0.0297) .. (-0.8592,-0.0296) + .. controls (-0.8262,-0.0830) and (-0.8655,-0.1092) .. (-0.7971,-0.1209) + -- (-0.7875, 0.0068) + -- (-0.8579, 0.1174) + --cycle + (-0.4453, 0.0979) + .. controls (-0.4922, 0.0916) and (-0.4988, 0.0347) .. (-0.4759, 0.0116) + .. controls (-0.4491,-0.0149) and (-0.4165, 0.0208) .. (-0.3900, 0.0116) + .. controls (-0.3555,-0.0011) and (-0.3800,-0.0410) .. (-0.3751,-0.0698) + -- (-0.3537,-0.1294) + .. controls (-0.3428,-0.1879) and (-0.4042,-0.1777) .. (-0.3801,-0.2656) + .. controls (-0.3617,-0.2531) and (-0.3352,-0.2292) .. (-0.3122,-0.2330) + .. controls (-0.2845,-0.2375) and (-0.2669,-0.2694) .. (-0.2543,-0.2911) + .. controls (-0.2183,-0.3533) and (-0.2004,-0.3613) .. (-0.2184,-0.4358) + .. controls (-0.3300,-0.4097) and (-0.2723,-0.5065) .. (-0.2483,-0.5549) + -- (-0.2129,-0.6314) + .. controls (-0.2017,-0.6508) and (-0.1900,-0.6661) .. (-0.1670,-0.6712) + .. controls (-0.1211,-0.6813) and (-0.1100,-0.6527) .. (-0.1163,-0.6145) + .. controls (-0.1327,-0.6119) and (-0.1427,-0.6118) .. (-0.1568,-0.6009) + .. controls (-0.1780,-0.5845) and (-0.2123,-0.5041) .. (-0.2042,-0.4783) + .. controls (-0.1947,-0.4484) and (-0.1575,-0.4121) .. (-0.1333,-0.3932) + -- (-0.1527,-0.3251) + -- (-0.1588,-0.2656) + .. controls (-0.2187,-0.2715) and (-0.2083,-0.2536) .. (-0.2457,-0.2163) + .. controls (-0.2684,-0.1935) and (-0.2911,-0.1886) .. (-0.2996,-0.1546) + -- (-0.2996,-0.1209) + -- (-0.3232,-0.0698) + .. controls (-0.3283,-0.0435) and (-0.3124,-0.0260) .. (-0.3175,-0.0041) + .. controls (-0.3251, 0.0283) and (-0.3891, 0.0917) .. (-0.4227, 0.0973) + .. controls (-0.4311, 0.0987) and (-0.4386, 0.0989) .. (-0.4453, 0.0979) + --cycle + (-0.1163,-0.6145) + -- (-0.0812,-0.6009) + -- (-0.0509,-0.4868) + -- (-0.0567,-0.4528) + .. controls (-0.1227,-0.4845) and (-0.1350,-0.5483) .. (-0.1163,-0.6145) + --cycle + ( 0.9165, 0.0573) + .. controls ( 0.8982, 0.0512) and ( 0.8800, 0.0260) .. ( 0.8880,-0.0013) + .. controls ( 0.8973,-0.0334) and ( 0.9330,-0.0408) .. ( 0.9466,-0.0703) + .. controls ( 0.9528,-0.0838) and ( 0.9514,-0.0964) .. ( 0.9506,-0.1091) + -- ( 1.0000,-0.0243) + .. controls ( 0.9816,-0.0179) and ( 0.9678,-0.0119) .. ( 0.9563, 0.0077) + .. controls ( 0.9465, 0.0244) and ( 0.9476, 0.0488) .. ( 0.9340, 0.0564) + .. controls ( 0.9288, 0.0593) and ( 0.9227, 0.0593) .. ( 0.9165, 0.0573) + --cycle + (-0.7064, 0.0069) + .. controls (-0.7128, 0.0077) and (-0.7187, 0.0075) .. (-0.7237, 0.0061) + .. controls (-0.7255, 0.0030) and (-0.7310, 0.0025) .. (-0.7316,-0.0115) + .. controls (-0.7321,-0.0230) and (-0.7071,-0.1058) .. (-0.6984,-0.1096) + .. controls (-0.6872,-0.1176) and (-0.6721,-0.1116) .. (-0.6609,-0.1096) + .. controls (-0.6502,-0.1046) and (-0.6316,-0.0986) .. (-0.6242,-0.0900) + .. controls (-0.5901,-0.0507) and (-0.6615, 0.0017) .. (-0.7064, 0.0069) + --cycle + (-1.0000, 0.0068) + -- (-1.0000, 0.0020) + -- (-0.9548,-0.0788) + .. controls (-0.9170,-0.0310) and (-0.9342,-0.0158) .. (-1.0000, 0.0068) + --cycle + (-0.2643, 0.0054) + .. controls (-0.2853,-0.0295) and (-0.2523,-0.0713) .. (-0.2182,-0.0843) + .. controls (-0.2024,-0.0902) and (-0.1781,-0.0944) .. (-0.1687,-0.0757) + .. controls (-0.1530,-0.0441) and (-0.2378, 0.0095) .. (-0.2643, 0.0054) + --cycle + ( 0.6299,-0.0102) + .. controls ( 0.6155,-0.0145) and ( 0.6071,-0.0342) .. ( 0.6128,-0.0510) + .. controls ( 0.6198,-0.0721) and ( 0.6440,-0.0790) .. ( 0.6606,-0.0986) + .. controls ( 0.6738,-0.1143) and ( 0.6761,-0.1328) .. ( 0.6948,-0.1437) + .. controls ( 0.7092,-0.1520) and ( 0.7311,-0.1484) .. ( 0.7401,-0.1664) + .. controls ( 0.7461,-0.1784) and ( 0.7351,-0.2363) .. ( 0.7348,-0.2570) + .. controls ( 0.7336,-0.3524) and ( 0.7289,-0.3324) .. ( 0.7620,-0.4187) + .. controls ( 0.7631,-0.4216) and ( 0.7642,-0.4246) .. ( 0.7652,-0.4275) + -- ( 0.8003,-0.3672) + .. controls ( 0.7976,-0.3636) and ( 0.7942,-0.3606) .. ( 0.7918,-0.3568) + .. controls ( 0.7778,-0.3349) and ( 0.7645,-0.2537) .. ( 0.7970,-0.2417) + .. controls ( 0.8206,-0.2330) and ( 0.8347,-0.2671) .. ( 0.8432,-0.2822) + -- ( 0.8469,-0.2872) + -- ( 0.8787,-0.2326) + -- ( 0.8594,-0.1993) + .. controls ( 0.8496,-0.1847) and ( 0.7996,-0.1314) .. ( 0.7847,-0.1281) + .. controls ( 0.7712,-0.1229) and ( 0.7642,-0.1268) .. ( 0.7518,-0.1281) + .. controls ( 0.7451,-0.1148) and ( 0.7397,-0.1014) .. ( 0.7293,-0.0886) + -- ( 0.6461,-0.0117) + .. controls ( 0.6402,-0.0090) and ( 0.6347,-0.0087) .. ( 0.6299,-0.0102) + --cycle + (-0.5178,-0.0844) + .. controls (-0.5451,-0.0820) and (-0.5852,-0.0947) .. (-0.5902,-0.1144) + .. controls (-0.6007,-0.1557) and (-0.5621,-0.1731) .. (-0.5414,-0.1997) + .. controls (-0.5274,-0.2177) and (-0.5229,-0.2355) .. (-0.5044,-0.2525) + .. controls (-0.4888,-0.2669) and (-0.4706,-0.2705) .. (-0.4543,-0.2923) + .. controls (-0.4420,-0.3087) and (-0.4220,-0.3707) .. (-0.4141,-0.3932) + .. controls (-0.3620,-0.3875) and (-0.3060,-0.4031) .. (-0.3060,-0.3592) + .. controls (-0.3060,-0.3272) and (-0.3358,-0.3272) .. (-0.3716,-0.3008) + .. controls (-0.4367,-0.2529) and (-0.4253,-0.2451) .. (-0.4621,-0.1914) + .. controls (-0.4700,-0.1800) and (-0.4814,-0.1685) .. (-0.4867,-0.1556) + .. controls (-0.4970,-0.1308) and (-0.4804,-0.1088) .. (-0.4966,-0.0923) + .. controls (-0.5011,-0.0877) and (-0.5087,-0.0853) .. (-0.5178,-0.0844) + --cycle + (-0.4165,-0.0846) + .. controls (-0.4357,-0.0807) and (-0.4622,-0.1075) .. (-0.4395,-0.1440) + .. controls (-0.4316,-0.1566) and (-0.4254,-0.1571) .. (-0.4141,-0.1634) + .. controls (-0.4094,-0.1522) and (-0.4042,-0.1415) .. (-0.4019,-0.1294) + .. controls (-0.3960,-0.1004) and (-0.4049,-0.0870) .. (-0.4165,-0.0846) + --cycle + (-0.9358,-0.1125) + -- (-0.8813,-0.2098) + .. controls (-0.8768,-0.1903) and (-0.8656,-0.1673) .. (-0.8723,-0.1485) + .. controls (-0.8801,-0.1269) and (-0.9022,-0.1274) .. (-0.9358,-0.1125) + --cycle + ( 0.1455,-0.1458) + .. controls ( 0.1402,-0.1449) and ( 0.1336,-0.1452) .. ( 0.1255,-0.1471) + .. controls ( 0.0901,-0.1850) and ( 0.1064,-0.2454) .. ( 0.1360,-0.2301) + .. controls ( 0.1569,-0.2194) and ( 0.1827,-0.1522) .. ( 0.1455,-0.1458) + --cycle + (-0.1477,-0.1474) + .. controls (-0.1646,-0.1458) and (-0.1813,-0.1543) .. (-0.1847,-0.1659) + .. controls (-0.1889,-0.1806) and (-0.1612,-0.2953) .. (-0.1163,-0.2315) + -- (-0.0420,-0.4418) + .. controls (-0.0291,-0.4661) and (-0.0068,-0.4600) .. ( 0.0136,-0.4880) + .. controls ( 0.0294,-0.5097) and ( 0.0259,-0.5331) .. ( 0.0419,-0.5487) + .. controls ( 0.0694,-0.5755) and ( 0.1462,-0.5710) .. ( 0.1798,-0.6001) + -- ( 0.2188,-0.6436) + .. controls ( 0.2392,-0.6605) and ( 0.2566,-0.6577) .. ( 0.2804,-0.6838) + .. controls ( 0.3122,-0.7186) and ( 0.3037,-0.7586) .. ( 0.3603,-0.7592) + .. controls ( 0.3537,-0.7217) and ( 0.3358,-0.6781) .. ( 0.3603,-0.6427) + .. controls ( 0.3743,-0.6222) and ( 0.3978,-0.6232) .. ( 0.4032,-0.6039) + .. controls ( 0.4084,-0.5852) and ( 0.3901,-0.5654) .. ( 0.3712,-0.5741) + .. controls ( 0.3573,-0.5804) and ( 0.3558,-0.5936) .. ( 0.3518,-0.6044) + .. controls ( 0.3319,-0.6046) and ( 0.2996,-0.6092) .. ( 0.2842,-0.6044) + .. controls ( 0.2568,-0.5917) and ( 0.2515,-0.5648) .. ( 0.2231,-0.5501) + .. controls ( 0.1960,-0.5359) and ( 0.1632,-0.5421) .. ( 0.1413,-0.5292) + -- ( 0.0626,-0.4601) + .. controls ( 0.0525,-0.4430) and ( 0.0547,-0.4207) .. ( 0.0440,-0.4065) + .. controls ( 0.0320,-0.3906) and ( 0.0076,-0.3898) .. (-0.0104,-0.3714) + .. controls (-0.0515,-0.3289) and ( 0.0146,-0.2721) .. (-0.0737,-0.2358) + .. controls (-0.0903,-0.2290) and (-0.0917,-0.2313) .. (-0.1098,-0.2315) + -- (-0.1098,-0.1892) + .. controls (-0.1137,-0.1607) and (-0.1308,-0.1491) .. (-0.1477,-0.1474) + --cycle + (-0.7679,-0.1481) + .. controls (-0.8119,-0.1523) and (-0.8157,-0.2051) .. (-0.8303,-0.2401) + -- (-0.8453,-0.2740) + -- (-0.8299,-0.3015) + .. controls (-0.7861,-0.2968) and (-0.8116,-0.2403) .. (-0.7732,-0.2278) + .. controls (-0.7561,-0.2223) and (-0.7349,-0.2415) .. (-0.7204,-0.2497) + .. controls (-0.6711,-0.2774) and (-0.6473,-0.2864) .. (-0.6524,-0.3506) + -- (-0.6787,-0.3422) + .. controls (-0.6786,-0.3475) and (-0.6826,-0.3544) .. (-0.6787,-0.3655) + .. controls (-0.6635,-0.4244) and (-0.5943,-0.3658) .. (-0.5763,-0.3760) + .. controls (-0.5586,-0.3861) and (-0.5497,-0.4251) .. (-0.5357,-0.4418) + .. controls (-0.5118,-0.4701) and (-0.4694,-0.4662) .. (-0.4504,-0.5047) + .. controls (-0.4231,-0.5599) and (-0.4535,-0.6772) .. (-0.4451,-0.7421) + .. controls (-0.4389,-0.7901) and (-0.4023,-0.8005) .. (-0.3912,-0.8443) + .. controls (-0.3883,-0.8558) and (-0.3874,-0.8667) .. (-0.3869,-0.8774) + -- (-0.3386,-0.8778) + .. controls (-0.3371,-0.8645) and (-0.3342,-0.8523) .. (-0.3394,-0.8358) + .. controls (-0.3448,-0.8167) and (-0.3914,-0.7567) .. (-0.3962,-0.6996) + .. controls (-0.4039,-0.6074) and (-0.3294,-0.5871) .. (-0.3545,-0.4954) + -- (-0.3886,-0.5039) + -- (-0.4196,-0.4442) + -- (-0.4864,-0.4090) + -- (-0.5345,-0.3241) + -- (-0.6106,-0.2802) + -- (-0.6106,-0.1975) + .. controls (-0.6301,-0.2027) and (-0.6486,-0.2101) .. (-0.6694,-0.2022) + .. controls (-0.7004,-0.1904) and (-0.7133,-0.1559) .. (-0.7464,-0.1495) + .. controls (-0.7544,-0.1479) and (-0.7616,-0.1475) .. (-0.7679,-0.1481) + --cycle + ( 0.0029,-0.2060) + .. controls (-0.0139,-0.2731) and ( 0.0196,-0.2608) .. ( 0.0476,-0.3014) + .. controls ( 0.0682,-0.3314) and ( 0.0511,-0.3569) .. ( 0.0750,-0.3784) + .. controls ( 0.0974,-0.3988) and ( 0.1304,-0.3876) .. ( 0.1549,-0.4019) + .. controls ( 0.1795,-0.4164) and ( 0.1878,-0.4529) .. ( 0.1987,-0.4783) + .. controls ( 0.2461,-0.4539) and ( 0.2519,-0.4021) .. ( 0.2180,-0.3618) + .. controls ( 0.1964,-0.3362) and ( 0.1652,-0.3426) .. ( 0.1414,-0.3257) + .. controls ( 0.1198,-0.3103) and ( 0.1183,-0.2881) .. ( 0.1007,-0.2689) + .. controls ( 0.0838,-0.2504) and ( 0.0265,-0.2166) .. ( 0.0029,-0.2060) + --cycle + ( 0.2327,-0.2826) + .. controls ( 0.1961,-0.2955) and ( 0.1961,-0.3123) .. ( 0.2327,-0.3251) + --cycle + (-0.7548,-0.3137) + .. controls (-0.7774,-0.3164) and (-0.7890,-0.3323) .. (-0.7986,-0.3573) + -- (-0.7759,-0.3979) + .. controls (-0.7735,-0.3968) and (-0.7711,-0.3964) .. (-0.7688,-0.3946) + -- (-0.7205,-0.3166) + .. controls (-0.7341,-0.3135) and (-0.7454,-0.3126) .. (-0.7548,-0.3137) + --cycle + ( 0.4114,-0.3847) + .. controls ( 0.4216,-0.4136) and ( 0.4238,-0.4142) .. ( 0.4540,-0.4102) + -- ( 0.4540,-0.3932) + --cycle + ( 0.5395,-0.3997) + .. controls ( 0.5263,-0.3990) and ( 0.5044,-0.4032) .. ( 0.4625,-0.4018) + -- ( 0.4780,-0.4954) + .. controls ( 0.4757,-0.5287) and ( 0.4518,-0.5542) .. ( 0.4648,-0.5776) + .. controls ( 0.4852,-0.6142) and ( 0.5202,-0.5603) .. ( 0.5614,-0.5929) + .. controls ( 0.5752,-0.6038) and ( 0.6063,-0.6359) .. ( 0.6275,-0.6638) + -- ( 0.6570,-0.6132) + .. controls ( 0.6460,-0.6042) and ( 0.6347,-0.5954) .. ( 0.6268,-0.5865) + -- ( 0.5937,-0.5346) + .. controls ( 0.5648,-0.5023) and ( 0.5031,-0.4880) .. ( 0.5646,-0.4273) + .. controls ( 0.5574,-0.4062) and ( 0.5528,-0.4005) .. ( 0.5395,-0.3997) + --cycle + (-0.6609,-0.4273) + .. controls (-0.7027,-0.4247) and (-0.7300,-0.4414) .. (-0.7397,-0.4624) + -- (-0.7047,-0.5249) + .. controls (-0.7013,-0.5263) and (-0.6989,-0.5282) .. (-0.6950,-0.5294) + .. controls (-0.6935,-0.4878) and (-0.6933,-0.4806) .. (-0.6609,-0.4528) + --cycle + (-0.5689,-0.4528) + .. controls (-0.6368,-0.4677) and (-0.6352,-0.5020) .. (-0.6354,-0.5634) + -- (-0.5757,-0.6071) + -- (-0.5162,-0.6826) + .. controls (-0.5073,-0.6508) and (-0.5037,-0.6125) .. (-0.5241,-0.5838) + .. controls (-0.5384,-0.5639) and (-0.5622,-0.5584) .. (-0.5689,-0.5361) + .. controls (-0.5775,-0.5167) and (-0.5648,-0.4918) .. (-0.5689,-0.4528) + --cycle + (-0.6354,-0.5634) + .. controls (-0.6583,-0.5576) and (-0.6713,-0.5579) .. (-0.6839,-0.5619) + -- (-0.6487,-0.6248) + .. controls (-0.6395,-0.6053) and (-0.6326,-0.5852) .. (-0.6354,-0.5634) + --cycle + (-0.0056,-0.5890) + .. controls (-0.0554,-0.6155) and (-0.0426,-0.6370) .. (-0.0606,-0.6818) + -- (-0.1199,-0.7847) + .. controls (-0.1298,-0.8015) and (-0.1531,-0.8317) .. (-0.1499,-0.8510) + .. controls (-0.1482,-0.8615) and (-0.1397,-0.8702) .. (-0.1295,-0.8795) + -- (-0.0507,-0.8802) + .. controls (-0.0629,-0.8583) and (-0.0745,-0.8380) .. (-0.0742,-0.8358) + .. controls (-0.0792,-0.8239) and (-0.0776,-0.8135) .. (-0.0742,-0.8027) + .. controls (-0.0460,-0.7520) and ( 0.0016,-0.7834) .. ( 0.0277,-0.7780) + .. controls ( 0.0760,-0.7679) and ( 0.1284,-0.6914) .. ( 0.1207,-0.6405) + .. controls ( 0.1150,-0.6017) and ( 0.0841,-0.6082) .. ( 0.0711,-0.6267) + .. controls ( 0.0620,-0.6397) and ( 0.0556,-0.7141) .. ( 0.0539,-0.7336) + .. controls (-0.0413,-0.7085) and ( 0.0139,-0.6637) .. (-0.0056,-0.5890) + --cycle + ( 0.4284,-0.6571) + .. controls ( 0.4285,-0.7307) and ( 0.4284,-0.7652) .. ( 0.5135,-0.7336) + .. controls ( 0.5170,-0.7469) and ( 0.5220,-0.7585) .. ( 0.5179,-0.7726) + .. controls ( 0.5091,-0.8019) and ( 0.4473,-0.8546) .. ( 0.4851,-0.8847) + -- ( 0.4987,-0.8848) + -- ( 0.5768,-0.7509) + .. controls ( 0.5767,-0.7509) and ( 0.5767,-0.7507) .. ( 0.5767,-0.7507) + .. controls ( 0.5412,-0.6652) and ( 0.5083,-0.6726) .. ( 0.4284,-0.6571) + --cycle + (-0.2914,-0.6672) + .. controls (-0.2998,-0.6666) and (-0.3106,-0.6686) .. (-0.3250,-0.6743) + .. controls (-0.3545,-0.7128) and (-0.3081,-0.7358) .. (-0.2850,-0.7678) + .. controls (-0.2710,-0.7873) and (-0.2601,-0.8137) .. (-0.2351,-0.8216) + .. controls (-0.2083,-0.8301) and (-0.1916,-0.8105) .. (-0.1960,-0.7845) + .. controls (-0.2008,-0.7566) and (-0.2232,-0.7418) .. (-0.2396,-0.7216) + .. controls (-0.2612,-0.6950) and (-0.2660,-0.6690) .. (-0.2914,-0.6672) + --cycle + (-0.5641,-0.6998) + .. controls (-0.5850,-0.6984) and (-0.5808,-0.7367) .. (-0.5766,-0.7507) + .. controls (-0.5748,-0.7566) and (-0.5723,-0.7598) .. (-0.5702,-0.7648) + -- (-0.5492,-0.8022) + .. controls (-0.5310,-0.8247) and (-0.5120,-0.8367) .. (-0.5052,-0.8613) + .. controls (-0.5044,-0.8642) and (-0.5062,-0.8717) .. (-0.5063,-0.8763) + -- (-0.4585,-0.8767) + .. controls (-0.4596,-0.7984) and (-0.5013,-0.7963) .. (-0.5234,-0.7583) + .. controls (-0.5344,-0.7394) and (-0.5352,-0.7120) .. (-0.5535,-0.7030) + .. controls (-0.5576,-0.7010) and (-0.5611,-0.7000) .. (-0.5641,-0.6998) + --cycle + ( 0.1990,-0.7341) + .. controls ( 0.1094,-0.7768) and ( 0.2330,-0.8330) .. ( 0.2586,-0.8828) + -- ( 0.3183,-0.8833) + .. controls ( 0.3165,-0.8684) and ( 0.3066,-0.8565) .. ( 0.2991,-0.8428) + .. controls ( 0.2762,-0.8010) and ( 0.2508,-0.7418) .. ( 0.1990,-0.7341) + --cycle + ( 0.3603,-0.7592) + -- ( 0.3859,-0.8188) + .. controls ( 0.4178,-0.7853) and ( 0.4108,-0.7527) .. ( 0.3603,-0.7592) + --cycle + ( 0.4369,-0.8443) + .. controls ( 0.4147,-0.8480) and ( 0.3837,-0.8661) .. ( 0.3628,-0.8837) + -- ( 0.4240,-0.8842) + .. controls ( 0.4307,-0.8690) and ( 0.4358,-0.8541) .. ( 0.4369,-0.8443) + --cycle + (-0.3205,-0.8528) + -- (-0.3266,-0.8779) + -- (-0.2773,-0.8783) + .. controls (-0.2800,-0.8719) and (-0.2850,-0.8655) .. (-0.2963,-0.8600) + --cycle + ( 0.1093,-0.8568) + .. controls ( 0.0964,-0.8568) and ( 0.0834,-0.8587) .. ( 0.0710,-0.8600) + .. controls ( 0.0605,-0.8611) and ( 0.0403,-0.8617) .. ( 0.0312,-0.8664) + .. controls ( 0.0240,-0.8701) and ( 0.0203,-0.8751) .. ( 0.0184,-0.8808) + -- ( 0.1002,-0.8815) + -- ( 0.1050,-0.8698) + -- ( 0.1085,-0.8815) + -- ( 0.1641,-0.8820) + .. controls ( 0.1606,-0.8757) and ( 0.1553,-0.8698) .. ( 0.1463,-0.8649) + .. controls ( 0.1347,-0.8586) and ( 0.1221,-0.8568) .. ( 0.1093,-0.8568) + --cycle + ; + } +} +\fi +% \end{macrocode} +% \end{TikzKey} +% +% \iffalse +%</hex> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/hex/terrain/rough.dtx b/macros/latex/contrib/wargame/source/hex/terrain/rough.dtx new file mode 100644 index 0000000000..fe716add2f --- /dev/null +++ b/macros/latex/contrib/wargame/source/hex/terrain/rough.dtx @@ -0,0 +1,1570 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*hex> +% \fi +% \begin{TikzKey}{hex/terrain/rough} +% The style for rough hexes. The pattern is filled with a light +% brown, and outlines are not drawn. +% +% \begin{macrocode} +\tikzset{ + hex/terrain/rough/.style={ + draw=none, + fill={rgb,100:red,79;green,68;blue,41} + } +} +% \end{macrocode} +% \end{TikzKey} +% +% \begin{TikzKey}{hex/terrain/rough} +% Roughs. Again, a bit long. +% +% +% \begin{macrocode} +\ifhex@terrain@pic +\tikzset{ + hex/terrain/rough/.pic={ + \path[hex/terrain/rough,pic actions,draw=none] + (-0.2701, 0.8873) + .. controls (-0.2982, 0.8927) and (-0.3250, 0.8675) .. (-0.3296, 0.8537) + .. controls (-0.3363, 0.8337) and (-0.3058, 0.8263) .. (-0.2820, 0.8610) + .. controls (-0.2717, 0.8450) and (-0.2591, 0.8228) .. (-0.2441, 0.8112) + .. controls (-0.2057, 0.7817) and (-0.1394, 0.7709) .. (-0.1208, 0.8270) + -- (-0.2226, 0.8355) + .. controls (-0.2359, 0.8698) and (-0.2532, 0.8840) .. (-0.2701, 0.8873) + --cycle + (-0.1081, 0.8792) + .. controls (-0.1371, 0.8680) and (-0.1265, 0.8900) .. (-0.1377, 0.8610) + .. controls (-0.1121, 0.8691) and (-0.1163, 0.8536) .. (-0.1081, 0.8792) + --cycle + ( 0.1762, 0.8752) + -- ( 0.1761, 0.8710) + .. controls ( 0.1746, 0.8556) and ( 0.1707, 0.8704) .. ( 0.1822, 0.8575) + .. controls ( 0.1958, 0.8423) and ( 0.2514, 0.8065) .. ( 0.2435, 0.8694) + --cycle + ( 0.3216, 0.8740) + .. controls ( 0.3061, 0.8744) and ( 0.2932, 0.8668) .. ( 0.2896, 0.8414) + .. controls ( 0.2869, 0.8222) and ( 0.3049, 0.8110) .. ( 0.3122, 0.7930) + -- ( 0.3292, 0.7930) + -- ( 0.3377, 0.8440) + -- ( 0.3874, 0.8438) + -- ( 0.3702, 0.8584) + .. controls ( 0.3556, 0.8652) and ( 0.3372, 0.8736) .. ( 0.3216, 0.8740) + --cycle + ( 0.4696, 0.8697) + .. controls ( 0.4362, 0.8687) and ( 0.4116, 0.8113) .. ( 0.4594, 0.7865) + -- ( 0.4565, 0.8238) + -- ( 0.5034, 0.8485) + .. controls ( 0.4927, 0.8641) and ( 0.4807, 0.8700) .. ( 0.4696, 0.8697) + --cycle + (-0.0783, 0.8695) + -- (-0.0698, 0.8185) + -- (-0.0528, 0.8185) + .. controls (-0.0488, 0.8507) and (-0.0499, 0.8533) .. (-0.0783, 0.8695) + --cycle + ( 0.0321, 0.8695) + .. controls (-0.0074, 0.8534) and (-0.0195, 0.8453) .. (-0.0104, 0.8015) + .. controls ( 0.0252, 0.8183) and ( 0.0356, 0.8295) .. ( 0.0321, 0.8695) + --cycle + (-0.4155, 0.8596) + .. controls (-0.4417, 0.8307) and (-0.4165, 0.8213) .. (-0.4032, 0.8284) + .. controls (-0.3903, 0.8353) and (-0.3789, 0.8639) .. (-0.4155, 0.8596) + --cycle + (-0.4857, 0.8525) + .. controls (-0.4972, 0.8321) and (-0.5172, 0.8207) .. (-0.5389, 0.8116) + -- (-0.5595, 0.7763) + .. controls (-0.5377, 0.7748) and (-0.5144, 0.7944) .. (-0.4942, 0.8100) + -- (-0.4857, 0.7845) + .. controls (-0.4503, 0.8051) and (-0.4552, 0.8169) .. (-0.4688, 0.8525) + --cycle + ( 0.1002, 0.8511) + .. controls ( 0.0869, 0.8528) and ( 0.0769, 0.8478) .. ( 0.0696, 0.8260) + -- ( 0.1509, 0.8185) + -- ( 0.1509, 0.8355) + .. controls ( 0.1302, 0.8408) and ( 0.1135, 0.8493) .. ( 0.1002, 0.8511) + --cycle + ( 0.2485, 0.8268) + .. controls ( 0.2378, 0.8296) and ( 0.2250, 0.8213) .. ( 0.2103, 0.7930) + .. controls ( 0.2410, 0.7676) and ( 0.2451, 0.7555) .. ( 0.2867, 0.7591) + .. controls ( 0.2791, 0.7861) and ( 0.2665, 0.8220) .. ( 0.2485, 0.8268) + --cycle + (-0.3754, 0.8100) + -- (-0.3754, 0.7930) + -- (-0.3330, 0.7930) + -- (-0.3330, 0.8100) + --cycle + ( 0.5066, 0.8010) + -- ( 0.5131, 0.7667) + -- ( 0.5443, 0.7538) + -- ( 0.5566, 0.7611) + -- ( 0.5392, 0.7958) + --cycle + (-0.4008, 0.7930) + -- (-0.4348, 0.7591) + --cycle + ( 0.1509, 0.7930) + -- ( 0.1254, 0.7676) + .. controls ( 0.1432, 0.7361) and ( 0.1497, 0.7365) .. ( 0.1849, 0.7336) + .. controls ( 0.1820, 0.7688) and ( 0.1824, 0.7753) .. ( 0.1509, 0.7930) + --cycle + ( 0.0301, 0.7854) + .. controls ( 0.0240, 0.7861) and ( 0.0162, 0.7858) .. ( 0.0066, 0.7845) + -- ( 0.0490, 0.7421) + .. controls ( 0.0527, 0.7709) and ( 0.0486, 0.7831) .. ( 0.0301, 0.7854) + --cycle + (-0.2757, 0.7847) + .. controls (-0.2819, 0.7857) and (-0.2896, 0.7857) .. (-0.2990, 0.7845) + -- (-0.2820, 0.7411) + .. controls (-0.3010, 0.7423) and (-0.3576, 0.7485) .. (-0.3704, 0.7411) + .. controls (-0.3832, 0.7314) and (-0.3819, 0.7137) .. (-0.3644, 0.7089) + .. controls (-0.3522, 0.7029) and (-0.3199, 0.7069) .. (-0.3075, 0.7089) + .. controls (-0.2647, 0.7227) and (-0.2326, 0.7776) .. (-0.2757, 0.7847) + --cycle + ( 0.3631, 0.7676) + -- ( 0.3122, 0.7479) + .. controls ( 0.3064, 0.6995) and ( 0.3021, 0.7030) .. ( 0.3546, 0.7166) + .. controls ( 0.3550, 0.6777) and ( 0.3499, 0.6644) .. ( 0.3886, 0.6488) + .. controls ( 0.3854, 0.7398) and ( 0.3467, 0.6989) .. ( 0.3631, 0.7676) + --cycle + ( 0.5753, 0.7676) + .. controls ( 0.5837, 0.7354) and ( 0.5927, 0.7219) .. ( 0.6097, 0.7131) + -- ( 0.5796, 0.7669) + .. controls ( 0.5781, 0.7670) and ( 0.5768, 0.7674) .. ( 0.5753, 0.7676) + --cycle + (-0.5536, 0.7591) + -- (-0.5706, 0.7082) + -- (-0.5621, 0.6997) + -- (-0.5027, 0.6997) + .. controls (-0.5136, 0.7365) and (-0.5192, 0.7422) .. (-0.5536, 0.7591) + --cycle + (-0.1361, 0.7534) + .. controls (-0.1512, 0.7509) and (-0.1612, 0.7304) .. (-0.1462, 0.6912) + -- (-0.0953, 0.7082) + .. controls (-0.1007, 0.7406) and (-0.1210, 0.7560) .. (-0.1361, 0.7534) + --cycle + (-0.4655, 0.7519) + .. controls (-0.4811, 0.7476) and (-0.4887, 0.7146) .. (-0.4551, 0.6911) + .. controls (-0.4447, 0.6838) and (-0.4376, 0.6846) .. (-0.4263, 0.6827) + -- (-0.4362, 0.7201) + .. controls (-0.4440, 0.7466) and (-0.4562, 0.7544) .. (-0.4655, 0.7519) + --cycle + (-0.2311, 0.7421) + -- (-0.2480, 0.7082) + -- (-0.1971, 0.6827) + -- (-0.2141, 0.7421) + --cycle + ( 0.4819, 0.7421) + -- ( 0.5244, 0.7082) + -- ( 0.5329, 0.7166) + -- ( 0.5329, 0.7336) + --cycle + ( 0.4140, 0.7336) + .. controls ( 0.4091, 0.6951) and ( 0.4180, 0.6863) .. ( 0.4565, 0.6912) + --cycle + ( 0.1000, 0.7166) + .. controls ( 0.0969, 0.7064) and ( 0.0893, 0.6845) .. ( 0.0896, 0.6747) + .. controls ( 0.0911, 0.6142) and ( 0.1603, 0.6571) .. ( 0.1849, 0.6658) + -- ( 0.2260, 0.6725) + .. controls ( 0.2381, 0.6766) and ( 0.2515, 0.6891) .. ( 0.2429, 0.7019) + .. controls ( 0.2330, 0.7185) and ( 0.1897, 0.7058) .. ( 0.1756, 0.7019) + -- ( 0.1339, 0.6827) + --cycle + ( 0.0321, 0.7082) + -- (-0.0019, 0.6318) + .. controls ( 0.0528, 0.6362) and ( 0.0992, 0.6731) .. ( 0.0321, 0.7082) + --cycle + ( 0.5074, 0.6997) + .. controls ( 0.5090, 0.6563) and ( 0.5107, 0.6351) .. ( 0.5584, 0.6572) + --cycle + (-0.6116, 0.6867) + -- (-0.6413, 0.6359) + .. controls (-0.6321, 0.6229) and (-0.6158, 0.6171) .. (-0.6009, 0.6289) + .. controls (-0.5820, 0.6437) and (-0.5846, 0.6623) .. (-0.5876, 0.6827) + --cycle + (-0.3414, 0.6742) + .. controls (-0.3515, 0.6371) and (-0.3559, 0.6083) .. (-0.3075, 0.6148) + -- (-0.3245, 0.6742) + --cycle + (-0.5112, 0.6657) + -- (-0.5112, 0.6318) + -- (-0.4772, 0.6233) + -- (-0.5027, 0.5893) + -- (-0.5027, 0.5808) + -- (-0.4857, 0.5638) + .. controls (-0.4400, 0.6074) and (-0.4373, 0.6597) .. (-0.5112, 0.6657) + --cycle + (-0.2905, 0.6657) + .. controls (-0.2682, 0.6064) and (-0.2058, 0.5997) .. (-0.2141, 0.6657) + --cycle + (-0.0953, 0.6488) + -- (-0.1547, 0.6403) + -- (-0.1377, 0.5553) + -- (-0.1208, 0.5553) + .. controls (-0.0926, 0.5982) and (-0.0954, 0.5977) .. (-0.0953, 0.6488) + --cycle + ( 0.0915, 0.6403) + .. controls ( 0.0497, 0.6269) and ( 0.0505, 0.6133) .. ( 0.0490, 0.5723) + .. controls ( 0.0796, 0.5913) and ( 0.0822, 0.6066) .. ( 0.0915, 0.6403) + --cycle + ( 0.4310, 0.6403) + .. controls ( 0.4211, 0.6043) and ( 0.4125, 0.5931) .. ( 0.4480, 0.5723) + -- ( 0.4819, 0.6148) + -- ( 0.4819, 0.6318) + --cycle + ( 0.5838, 0.6403) + .. controls ( 0.5923, 0.5846) and ( 0.5925, 0.5918) .. ( 0.6362, 0.5668) + -- ( 0.6521, 0.5663) + -- ( 0.6615, 0.5890) + .. controls ( 0.6340, 0.6304) and ( 0.6328, 0.6347) .. ( 0.5838, 0.6403) + --cycle + ( 0.2018, 0.6233) + -- ( 0.2018, 0.5808) + -- ( 0.2358, 0.5808) + .. controls ( 0.2306, 0.6108) and ( 0.2301, 0.6119) .. ( 0.2018, 0.6233) + --cycle + ( 0.3200, 0.6175) + .. controls ( 0.3147, 0.6171) and ( 0.3095, 0.6162) .. ( 0.3037, 0.6159) + -- ( 0.3144, 0.5906) + .. controls ( 0.3494, 0.5385) and ( 0.3913, 0.6066) .. ( 0.3367, 0.6159) + .. controls ( 0.3306, 0.6176) and ( 0.3252, 0.6178) .. ( 0.3200, 0.6175) + --cycle + ( 0.1254, 0.6148) + -- ( 0.1169, 0.5553) + -- ( 0.1339, 0.5553) + -- ( 0.1594, 0.5808) + --cycle + (-0.0188, 0.6063) + .. controls (-0.0629, 0.5361) and (-0.0925, 0.5785) .. (-0.1038, 0.5044) + -- (-0.0528, 0.4875) + .. controls (-0.0307, 0.5232) and (-0.0275, 0.5285) .. ( 0.0151, 0.5299) + .. controls ( 0.0257, 0.5724) and ( 0.0206, 0.5860) .. (-0.0188, 0.6063) + --cycle + (-0.2820, 0.5893) + .. controls (-0.2753, 0.5073) and (-0.2107, 0.5185) .. (-0.1801, 0.5808) + --cycle + ( 0.5244, 0.5893) + .. controls ( 0.5408, 0.5621) and ( 0.5447, 0.5620) .. ( 0.5753, 0.5553) + .. controls ( 0.5625, 0.5873) and ( 0.5579, 0.5867) .. ( 0.5244, 0.5893) + --cycle + (-0.4023, 0.5839) + .. controls (-0.4095, 0.5826) and (-0.4161, 0.5794) .. (-0.4210, 0.5751) + .. controls (-0.4340, 0.5638) and (-0.4334, 0.5376) .. (-0.4348, 0.5214) + .. controls (-0.3835, 0.5433) and (-0.4044, 0.5361) .. (-0.3499, 0.5299) + .. controls (-0.3537, 0.5756) and (-0.3808, 0.5879) .. (-0.4023, 0.5839) + --cycle + (-0.6717, 0.5836) + -- (-0.7007, 0.5338) + .. controls (-0.6810, 0.5286) and (-0.6639, 0.5441) .. (-0.6717, 0.5836) + --cycle + (-0.5683, 0.5760) + .. controls (-0.5775, 0.5769) and (-0.5875, 0.5722) .. (-0.6045, 0.5638) + -- (-0.5876, 0.5214) + -- (-0.5367, 0.5553) + .. controls (-0.5506, 0.5688) and (-0.5590, 0.5752) .. (-0.5683, 0.5760) + --cycle + ( 0.2527, 0.5638) + -- ( 0.2782, 0.5129) + -- ( 0.2867, 0.5129) + -- ( 0.3037, 0.5299) + .. controls ( 0.2852, 0.5566) and ( 0.2848, 0.5585) .. ( 0.2527, 0.5638) + --cycle + ( 0.6946, 0.5616) + .. controls ( 0.6944, 0.5600) and ( 0.6921, 0.5548) .. ( 0.6787, 0.5413) + -- ( 0.6878, 0.5061) + .. controls ( 0.6794, 0.4976) and ( 0.6747, 0.5161) .. ( 0.6694, 0.5045) + -- ( 0.6262, 0.5469) + .. controls ( 0.6001, 0.4510) and ( 0.6708, 0.4762) .. ( 0.6776, 0.4804) + .. controls ( 0.6913, 0.4889) and ( 0.7003, 0.4848) .. ( 0.7078, 0.4982) + -- ( 0.7283, 0.4862) + -- ( 0.7151, 0.5087) + -- ( 0.6995, 0.5381) + .. controls ( 0.6915, 0.5505) and ( 0.6933, 0.5583) .. ( 0.6948, 0.5614) + --cycle + ( 0.1764, 0.5469) + .. controls ( 0.1765, 0.5023) and ( 0.1718, 0.4964) .. ( 0.2018, 0.4620) + -- ( 0.2443, 0.4790) + .. controls ( 0.2287, 0.5015) and ( 0.2286, 0.4995) .. ( 0.2018, 0.4960) + -- ( 0.1934, 0.5044) + -- ( 0.1934, 0.5469) + --cycle + ( 0.3971, 0.5384) + -- ( 0.4056, 0.5044) + -- ( 0.4649, 0.4875) + -- ( 0.4904, 0.5384) + -- ( 0.4395, 0.5214) + --cycle + ( 0.5668, 0.5384) + .. controls ( 0.5368, 0.5332) and ( 0.5357, 0.5327) .. ( 0.5244, 0.5044) + -- ( 0.5329, 0.4960) + -- ( 0.5668, 0.5044) + -- ( 0.5499, 0.4620) + .. controls ( 0.5250, 0.4718) and ( 0.5240, 0.4756) .. ( 0.5074, 0.4535) + -- ( 0.5584, 0.4280) + .. controls ( 0.6164, 0.4608) and ( 0.5800, 0.4918) .. ( 0.5668, 0.5384) + --cycle + ( 0.0770, 0.5310) + .. controls ( 0.0682, 0.5304) and ( 0.0588, 0.5222) .. ( 0.0538, 0.5053) + .. controls ( 0.0343, 0.4401) and ( 0.0794, 0.3794) .. ( 0.1169, 0.4450) + -- ( 0.0830, 0.4535) + .. controls ( 0.0904, 0.4711) and ( 0.1010, 0.4920) .. ( 0.0968, 0.5117) + .. controls ( 0.0941, 0.5249) and ( 0.0858, 0.5317) .. ( 0.0770, 0.5310) + --cycle + (-0.3075, 0.5299) + -- (-0.3414, 0.4790) + -- (-0.3330, 0.4705) + .. controls (-0.2926, 0.4813) and (-0.2724, 0.4931) .. (-0.3075, 0.5299) + --cycle + (-0.6105, 0.5210) + .. controls (-0.6292, 0.5286) and (-0.6359, 0.5102) .. (-0.6385, 0.4790) + -- (-0.5876, 0.5044) + .. controls (-0.5967, 0.5132) and (-0.6043, 0.5185) .. (-0.6105, 0.5210) + --cycle + (-0.6810, 0.5129) + .. controls (-0.6924, 0.5121) and (-0.7036, 0.5121) .. (-0.7147, 0.5086) + .. controls (-0.7151, 0.5085) and (-0.7153, 0.5083) .. (-0.7157, 0.5081) + -- (-0.7430, 0.4612) + .. controls (-0.7297, 0.4478) and (-0.7007, 0.4457) .. (-0.6860, 0.4801) + .. controls (-0.6815, 0.4906) and (-0.6819, 0.5019) .. (-0.6810, 0.5129) + --cycle + (-0.1462, 0.5129) + .. controls (-0.1949, 0.5129) and (-0.2098, 0.5207) .. (-0.2480, 0.4875) + -- (-0.2480, 0.4790) + -- (-0.2311, 0.4620) + -- (-0.1801, 0.4790) + -- (-0.1801, 0.4535) + -- (-0.1462, 0.4535) + --cycle + ( 0.0066, 0.5044) + -- (-0.0019, 0.4620) + .. controls (-0.0908, 0.4424) and (-0.0252, 0.3738) .. ( 0.0185, 0.4370) + .. controls ( 0.0238, 0.4448) and ( 0.0272, 0.4527) .. ( 0.0290, 0.4620) + .. controls ( 0.0322, 0.4784) and ( 0.0277, 0.4893) .. ( 0.0236, 0.5044) + --cycle + (-0.5118, 0.4944) + .. controls (-0.5315, 0.4962) and (-0.5506, 0.4944) .. (-0.5676, 0.4798) + .. controls (-0.5973, 0.4546) and (-0.5662, 0.4306) .. (-0.5676, 0.4033) + .. controls (-0.5682, 0.3806) and (-0.5896, 0.3679) .. (-0.5934, 0.3509) + .. controls (-0.6001, 0.3209) and (-0.5656, 0.2986) .. (-0.5452, 0.2838) + -- (-0.5621, 0.2498) + -- (-0.5282, 0.2498) + .. controls (-0.5165, 0.2920) and (-0.5111, 0.3040) .. (-0.5536, 0.3262) + .. controls (-0.5263, 0.3959) and (-0.5223, 0.3799) .. (-0.5452, 0.4535) + -- (-0.4857, 0.4705) + -- (-0.4518, 0.4535) + -- (-0.4518, 0.4875) + .. controls (-0.4715, 0.4873) and (-0.4920, 0.4926) .. (-0.5118, 0.4944) + --cycle + ( 0.3588, 0.4802) + .. controls ( 0.3533, 0.4806) and ( 0.3465, 0.4801) .. ( 0.3377, 0.4790) + -- ( 0.3801, 0.4365) + -- ( 0.3886, 0.4450) + .. controls ( 0.3795, 0.4694) and ( 0.3752, 0.4789) .. ( 0.3588, 0.4802) + --cycle + (-0.3923, 0.4620) + .. controls (-0.3995, 0.4156) and (-0.3752, 0.3562) .. (-0.3330, 0.3347) + -- (-0.3245, 0.3431) + -- (-0.3172, 0.4229) + -- (-0.3754, 0.4620) + --cycle + ( 0.1254, 0.4620) + .. controls ( 0.1311, 0.4303) and ( 0.1371, 0.3466) .. ( 0.1909, 0.3657) + .. controls ( 0.2082, 0.3718) and ( 0.2132, 0.3929) .. ( 0.2274, 0.4041) + .. controls ( 0.2376, 0.4123) and ( 0.2569, 0.4158) .. ( 0.2697, 0.4196) + .. controls ( 0.2404, 0.4707) and ( 0.2211, 0.4375) .. ( 0.1594, 0.4196) + --cycle + ( 0.6347, 0.4620) + .. controls ( 0.5865, 0.3970) and ( 0.5594, 0.4145) .. ( 0.5753, 0.3516) + .. controls ( 0.6248, 0.3639) and ( 0.6190, 0.3659) .. ( 0.6687, 0.3516) + .. controls ( 0.6624, 0.3942) and ( 0.6392, 0.4050) .. ( 0.6772, 0.4280) + --cycle + (-0.2735, 0.4535) + .. controls (-0.2776, 0.4212) and (-0.2764, 0.4187) .. (-0.2480, 0.4026) + -- (-0.2565, 0.4535) + --cycle + ( 0.4565, 0.4535) + -- ( 0.4395, 0.4365) + -- ( 0.4395, 0.4280) + -- ( 0.4565, 0.4111) + -- ( 0.4649, 0.4111) + -- ( 0.4819, 0.4280) + --cycle + ( 0.7558, 0.4524) + .. controls ( 0.7494, 0.4473) and ( 0.7430, 0.4394) .. ( 0.7366, 0.4280) + .. controls ( 0.7552, 0.4225) and ( 0.7653, 0.4183) .. ( 0.7753, 0.4176) + --cycle + (-0.4518, 0.4450) + -- (-0.4772, 0.4365) + -- (-0.4518, 0.4196) + --cycle + (-0.6423, 0.4300) + .. controls (-0.6532, 0.4307) and (-0.6637, 0.4304) .. (-0.6690, 0.4274) + .. controls (-0.6866, 0.4158) and (-0.6850, 0.3910) .. (-0.6630, 0.3848) + -- (-0.6130, 0.3848) + -- (-0.6130, 0.4274) + .. controls (-0.6201, 0.4279) and (-0.6314, 0.4294) .. (-0.6423, 0.4300) + --cycle + ( 0.7111, 0.4196) + -- ( 0.7451, 0.3771) + .. controls ( 0.7399, 0.4071) and ( 0.7394, 0.4082) .. ( 0.7111, 0.4196) + --cycle + (-0.7404, 0.4111) + -- (-0.7574, 0.3347) + -- (-0.7065, 0.3262) + -- (-0.7234, 0.4111) + --cycle + (-0.1547, 0.4111) + -- (-0.1462, 0.3601) + -- (-0.1038, 0.3856) + .. controls (-0.0885, 0.3562) and (-0.0864, 0.3520) .. (-0.0528, 0.3516) + -- (-0.0783, 0.4026) + --cycle + ( 0.3886, 0.4111) + .. controls ( 0.3213, 0.4055) and ( 0.3289, 0.3610) .. ( 0.3801, 0.3347) + --cycle + ( 0.3801, 0.3347) + -- ( 0.3801, 0.3262) + -- ( 0.3631, 0.3092) + -- ( 0.3801, 0.2753) + -- ( 0.3971, 0.2753) + .. controls ( 0.4050, 0.3067) and ( 0.4083, 0.3157) .. ( 0.3801, 0.3347) + --cycle + ( 0.5074, 0.4026) + -- ( 0.4565, 0.3516) + .. controls ( 0.4935, 0.3518) and ( 0.5571, 0.3505) .. ( 0.5074, 0.4026) + --cycle + (-0.4348, 0.3941) + -- (-0.4433, 0.3856) + -- (-0.4348, 0.3516) + -- (-0.4008, 0.3856) + --cycle + (-0.5112, 0.3856) + -- (-0.5027, 0.3347) + -- (-0.4518, 0.3856) + --cycle + ( 0.0405, 0.3856) + .. controls ( 0.0481, 0.3444) and ( 0.0444, 0.3224) .. ( 0.0830, 0.3007) + -- ( 0.1169, 0.3686) + --cycle + ( 0.2586, 0.3821) + .. controls ( 0.2327, 0.3759) and ( 0.2165, 0.3319) .. ( 0.2699, 0.3440) + -- ( 0.2952, 0.3516) + .. controls ( 0.2928, 0.3578) and ( 0.2924, 0.3646) .. ( 0.2856, 0.3722) + .. controls ( 0.2770, 0.3820) and ( 0.2672, 0.3842) .. ( 0.2586, 0.3821) + --cycle + (-0.2650, 0.3686) + .. controls (-0.2695, 0.3349) and (-0.2648, 0.3302) .. (-0.2311, 0.3347) + --cycle + ( 0.8037, 0.3670) + .. controls ( 0.7958, 0.3549) and ( 0.8002, 0.3405) .. ( 0.8215, 0.3262) + -- ( 0.8225, 0.3334) + --cycle + (-0.0104, 0.3601) + -- (-0.0273, 0.3007) + -- (-0.0698, 0.3007) + .. controls (-0.0385, 0.2465) and ( 0.0057, 0.2824) .. ( 0.0066, 0.3601) + --cycle + (-0.4348, 0.3431) + -- (-0.4348, 0.3007) + .. controls (-0.4123, 0.3163) and (-0.4143, 0.3163) .. (-0.4178, 0.3431) + --cycle + (-0.8185, 0.3317) + -- (-0.8365, 0.3007) + -- (-0.7998, 0.3007) + -- (-0.7998, 0.3177) + --cycle + ( 0.4649, 0.3315) + .. controls ( 0.4219, 0.3238) and ( 0.4094, 0.2904) .. ( 0.4395, 0.2583) + -- ( 0.4565, 0.2922) + -- ( 0.5414, 0.2922) + -- ( 0.5414, 0.3092) + .. controls ( 0.5190, 0.3194) and ( 0.4902, 0.3361) .. ( 0.4649, 0.3315) + --cycle + (-0.6388, 0.3309) + .. controls (-0.6527, 0.3328) and (-0.6597, 0.3256) .. (-0.6674, 0.3156) + -- (-0.6895, 0.2838) + .. controls (-0.6839, 0.2742) and (-0.6820, 0.2649) .. (-0.6700, 0.2597) + .. controls (-0.6290, 0.2418) and (-0.5917, 0.3244) .. (-0.6388, 0.3309) + --cycle + (-0.1462, 0.3262) + .. controls (-0.1623, 0.2693) and (-0.1610, 0.2418) .. (-0.0953, 0.2498) + -- (-0.1292, 0.3262) + --cycle + ( 0.2103, 0.3262) + -- ( 0.1849, 0.2753) + .. controls ( 0.2243, 0.2757) and ( 0.2321, 0.2881) .. ( 0.2273, 0.3262) + --cycle + ( 0.3292, 0.3262) + -- ( 0.2782, 0.2668) + -- ( 0.2782, 0.2498) + -- ( 0.3390, 0.2109) + .. controls ( 0.3506, 0.1937) and ( 0.3360, 0.1683) .. ( 0.3513, 0.1579) + .. controls ( 0.3686, 0.1461) and ( 0.4096, 0.1877) .. ( 0.3631, 0.2073) + -- ( 0.3801, 0.2243) + -- ( 0.3377, 0.2583) + -- ( 0.3546, 0.3007) + --cycle + ( 0.6941, 0.3262) + -- ( 0.6941, 0.2838) + -- ( 0.7111, 0.2838) + -- ( 0.7111, 0.3262) + --cycle + ( 0.7706, 0.3177) + -- ( 0.7366, 0.3092) + -- ( 0.7366, 0.2922) + -- ( 0.7451, 0.2838) + -- ( 0.7621, 0.2838) + --cycle + (-0.7913, 0.3092) + -- (-0.7828, 0.2583) + -- (-0.7658, 0.2583) + -- (-0.7574, 0.2668) + -- (-0.7743, 0.3092) + --cycle + ( 0.6093, 0.3092) + -- ( 0.5838, 0.2413) + -- ( 0.6093, 0.2668) + -- ( 0.6347, 0.2583) + -- ( 0.6432, 0.3092) + --cycle + (-0.3494, 0.3079) + .. controls (-0.4142, 0.2885) and (-0.3452, 0.2195) .. (-0.3258, 0.2842) + -- (-0.3258, 0.3079) + --cycle + ( 0.1084, 0.3007) + .. controls ( 0.1005, 0.2885) and ( 0.0956, 0.2764) .. ( 0.0807, 0.2708) + .. controls ( 0.0663, 0.2653) and ( 0.0431, 0.2752) .. ( 0.0335, 0.2617) + .. controls ( 0.0200, 0.2427) and ( 0.0540, 0.2322) .. ( 0.0660, 0.2298) + .. controls ( 0.1034, 0.2226) and ( 0.1204, 0.2407) .. ( 0.1509, 0.2583) + --cycle + (-0.2201, 0.2946) + .. controls (-0.2487, 0.2922) and (-0.2701, 0.2767) .. (-0.2990, 0.2583) + -- (-0.2565, 0.2073) + -- (-0.1886, 0.2922) + .. controls (-0.2003, 0.2947) and (-0.2106, 0.2954) .. (-0.2201, 0.2946) + --cycle + (-0.4772, 0.2583) + .. controls (-0.5022, 0.2481) and (-0.5267, 0.2367) .. (-0.5427, 0.2138) + .. controls (-0.5681, 0.1773) and (-0.5547, 0.1549) .. (-0.5112, 0.1575) + .. controls (-0.4976, 0.1584) and (-0.4899, 0.1613) .. (-0.4772, 0.1649) + -- (-0.4688, 0.1564) + -- (-0.4688, 0.1225) + -- (-0.4518, 0.1225) + .. controls (-0.4302, 0.1774) and (-0.4489, 0.1866) .. (-0.5027, 0.1988) + --cycle + (-0.4433, 0.2583) + -- (-0.4348, 0.2073) + -- (-0.4263, 0.2073) + -- (-0.4093, 0.2243) + -- (-0.4263, 0.2583) + --cycle + (-0.8446, 0.2512) + .. controls (-0.8626, 0.2459) and (-0.8672, 0.2066) .. (-0.8677, 0.1903) + .. controls (-0.8362, 0.1909) and (-0.8333, 0.1924) .. (-0.8168, 0.1649) + -- (-0.7913, 0.1734) + .. controls (-0.7979, 0.1888) and (-0.8118, 0.2347) .. (-0.8218, 0.2431) + .. controls (-0.8311, 0.2510) and (-0.8386, 0.2530) .. (-0.8446, 0.2512) + --cycle + (-0.6130, 0.2498) + -- (-0.6385, 0.1988) + .. controls (-0.5969, 0.2023) and (-0.5781, 0.2132) .. (-0.6130, 0.2498) + --cycle + ( 0.7209, 0.2469) + .. controls ( 0.7057, 0.2498) and ( 0.6918, 0.2452) .. ( 0.6875, 0.2241) + .. controls ( 0.6832, 0.1844) and ( 0.7333, 0.1800) .. ( 0.6875, 0.1309) + .. controls ( 0.6935, 0.1147) and ( 0.6966, 0.1050) .. ( 0.7123, 0.0936) + .. controls ( 0.7287, 0.0815) and ( 0.7996, 0.0650) .. ( 0.8166, 0.0782) + .. controls ( 0.8441, 0.0997) and ( 0.8443, 0.1468) .. ( 0.7875, 0.1564) + -- ( 0.8130, 0.1055) + -- ( 0.7706, 0.0970) + .. controls ( 0.7537, 0.1222) and ( 0.7493, 0.1200) .. ( 0.7196, 0.1225) + -- ( 0.7621, 0.2241) + .. controls ( 0.7526, 0.2335) and ( 0.7361, 0.2440) .. ( 0.7209, 0.2469) + --cycle + ( 0.5029, 0.2452) + .. controls ( 0.4837, 0.2409) and ( 0.4663, 0.2223) .. ( 0.4749, 0.2012) + .. controls ( 0.4861, 0.1737) and ( 0.5371, 0.1377) .. ( 0.5668, 0.1819) + .. controls ( 0.5276, 0.2081) and ( 0.5495, 0.2337) .. ( 0.5218, 0.2442) + .. controls ( 0.5159, 0.2464) and ( 0.5093, 0.2466) .. ( 0.5029, 0.2452) + --cycle + (-0.7065, 0.2328) + .. controls (-0.7174, 0.2318) and (-0.7287, 0.2323) .. (-0.7391, 0.2277) + .. controls (-0.7803, 0.2096) and (-0.7474, 0.1632) .. (-0.7171, 0.2086) + --cycle + (-0.0188, 0.2328) + .. controls (-0.0280, 0.2283) and (-0.0341, 0.2273) .. (-0.0430, 0.2197) + .. controls (-0.1097, 0.1629) and ( 0.0304, 0.1216) .. (-0.0010, 0.2037) + --cycle + ( 0.2612, 0.2328) + -- ( 0.1849, 0.2073) + .. controls ( 0.2210, 0.1548) and ( 0.2532, 0.1800) .. ( 0.2612, 0.2328) + --cycle + (-0.3330, 0.2243) + -- (-0.3958, 0.1938) + .. controls (-0.4203, 0.1689) and (-0.3928, 0.1505) .. (-0.4518, 0.0970) + -- (-0.4518, 0.0800) + .. controls (-0.4010, 0.0738) and (-0.3851, 0.1024) .. (-0.3754, 0.1479) + .. controls (-0.3297, 0.1544) and (-0.3165, 0.1646) .. (-0.2990, 0.2073) + --cycle + (-0.1971, 0.2243) + -- (-0.2056, 0.1479) + -- (-0.1462, 0.1394) + -- (-0.1462, 0.1564) + -- (-0.1801, 0.2243) + --cycle + ( 0.8384, 0.2243) + .. controls ( 0.8324, 0.1770) and ( 0.8519, 0.1318) .. ( 0.8979, 0.1140) + -- ( 0.9064, 0.1225) + .. controls ( 0.8952, 0.1805) and ( 0.8898, 0.1922) .. ( 0.8384, 0.2243) + --cycle + ( 0.0151, 0.2073) + -- ( 0.0151, 0.1903) + -- ( 0.0405, 0.1819) + -- ( 0.0405, 0.1479) + -- ( 0.0575, 0.1479) + -- ( 0.0575, 0.1564) + -- ( 0.0745, 0.1734) + .. controls ( 0.0548, 0.2031) and ( 0.0517, 0.2101) .. ( 0.0151, 0.2073) + --cycle + ( 0.6262, 0.2073) + -- ( 0.6347, 0.1734) + -- ( 0.6517, 0.1734) + -- ( 0.6602, 0.1819) + -- ( 0.6602, 0.1988) + --cycle + ( 0.7621, 0.2073) + -- ( 0.7621, 0.1649) + .. controls ( 0.7903, 0.1763) and ( 0.7908, 0.1774) .. ( 0.7960, 0.2073) + --cycle + (-0.8988, 0.1938) + -- (-0.9014, 0.1893) + .. controls (-0.9006, 0.1906) and (-0.8994, 0.1914) .. (-0.8988, 0.1930) + .. controls (-0.8987, 0.1933) and (-0.8989, 0.1936) .. (-0.8988, 0.1938) + --cycle + (-0.1292, 0.1903) + -- (-0.1292, 0.1479) + -- (-0.0953, 0.1819) + --cycle + ( 0.2952, 0.1903) + .. controls ( 0.2890, 0.1611) and ( 0.2867, 0.1567) .. ( 0.3122, 0.1394) + -- ( 0.3122, 0.1903) + --cycle + (-0.6895, 0.1819) + -- (-0.6895, 0.1479) + -- (-0.6640, 0.1564) + -- (-0.6640, 0.1734) + -- (-0.6725, 0.1819) + --cycle + ( 0.1480, 0.1735) + .. controls ( 0.1310, 0.1697) and ( 0.1252, 0.1423) .. ( 0.1594, 0.1225) + -- ( 0.1849, 0.1479) + .. controls ( 0.1726, 0.1694) and ( 0.1583, 0.1757) .. ( 0.1480, 0.1735) + --cycle + (-0.6300, 0.1734) + .. controls (-0.6429, 0.1238) and (-0.6284, 0.1142) .. (-0.5876, 0.0885) + -- (-0.6215, 0.0461) + -- (-0.6640, 0.0800) + .. controls (-0.6670, 0.0697) and (-0.6746, 0.0478) .. (-0.6743, 0.0381) + .. controls (-0.6736, 0.0066) and (-0.6456, 0.0044) .. (-0.6219, 0.0135) + .. controls (-0.5925, 0.0247) and (-0.5281, 0.0777) .. (-0.5319, 0.1120) + .. controls (-0.5350, 0.1399) and (-0.5677, 0.1315) .. (-0.5853, 0.1410) + .. controls (-0.5998, 0.1487) and (-0.6048, 0.1603) .. (-0.6130, 0.1734) + --cycle + (-0.6640, 0.0800) + .. controls (-0.6595, 0.1137) and (-0.6643, 0.1185) .. (-0.6980, 0.1140) + --cycle + (-0.2565, 0.1734) + -- (-0.3584, 0.1309) + -- (-0.3330, 0.0800) + -- (-0.2990, 0.1140) + .. controls (-0.2519, 0.1142) and (-0.2453, 0.1302) .. (-0.2565, 0.1734) + --cycle + ( 0.2271, 0.1407) + .. controls ( 0.1925, 0.1328) and ( 0.1533, 0.0767) .. ( 0.2190, 0.0890) + -- ( 0.2612, 0.0970) + .. controls ( 0.2604, 0.1073) and ( 0.2611, 0.1186) .. ( 0.2562, 0.1281) + .. controls ( 0.2497, 0.1405) and ( 0.2386, 0.1433) .. ( 0.2271, 0.1407) + --cycle + (-0.0698, 0.1394) + .. controls (-0.0981, 0.1280) and (-0.0986, 0.1270) .. (-0.1038, 0.0970) + -- (-0.0698, 0.0970) + --cycle + ( 0.3971, 0.1394) + -- ( 0.3971, 0.1225) + -- ( 0.4056, 0.1140) + -- ( 0.4395, 0.1225) + -- ( 0.4395, 0.1394) + --cycle + ( 0.6090, 0.1316) + .. controls ( 0.5968, 0.1320) and ( 0.5847, 0.1313) .. ( 0.5753, 0.1309) + .. controls ( 0.5937, 0.1034) and ( 0.6031, 0.1066) .. ( 0.6347, 0.1055) + .. controls ( 0.5863, 0.0654) and ( 0.5849, 0.0269) .. ( 0.6432,-0.0049) + -- ( 0.6262, 0.0461) + -- ( 0.6488, 0.0715) + .. controls ( 0.6828, 0.1212) and ( 0.6456, 0.1307) .. ( 0.6090, 0.1316) + --cycle + (-0.9354, 0.1309) + -- (-0.9422, 0.1193) + -- (-0.9356, 0.0800) + -- (-0.8847, 0.0970) + -- (-0.8847, 0.1309) + --cycle + (-0.8507, 0.1309) + .. controls (-0.8417, 0.0965) and (-0.8401, 0.0890) .. (-0.8083, 0.0715) + .. controls (-0.8126, 0.1087) and (-0.8139, 0.1187) .. (-0.8507, 0.1309) + --cycle + ( 0.1084, 0.1309) + -- ( 0.0575, 0.1225) + .. controls ( 0.0537, 0.0923) and ( 0.0510, 0.0922) .. ( 0.0236, 0.0800) + .. controls ( 0.0578, 0.0292) and ( 0.1015, 0.0713) .. ( 0.1084, 0.1309) + --cycle + ( 0.4819, 0.1309) + -- ( 0.5028, 0.0739) + -- ( 0.4819,-0.0049) + .. controls ( 0.4993,-0.0102) and ( 0.5299,-0.0233) .. ( 0.5472,-0.0163) + .. controls ( 0.5677,-0.0081) and ( 0.5663, 0.0195) .. ( 0.5644, 0.0376) + .. controls ( 0.5592, 0.0860) and ( 0.5308, 0.1235) .. ( 0.4819, 0.1309) + --cycle + ( 0.3461, 0.1140) + .. controls ( 0.3108, 0.0951) and ( 0.3082, 0.0849) .. ( 0.3037, 0.0461) + .. controls ( 0.3481, 0.0535) and ( 0.3552, 0.0713) .. ( 0.3461, 0.1140) + --cycle + (-0.4857, 0.0970) + .. controls (-0.5241, 0.0326) and (-0.4983, 0.0214) .. (-0.4348, 0.0206) + .. controls (-0.4420,-0.0343) and (-0.4036,-0.0413) .. (-0.3728,-0.0186) + .. controls (-0.3557,-0.0061) and (-0.3442, 0.0265) .. (-0.3330, 0.0461) + .. controls (-0.3807, 0.0916) and (-0.3834, 0.0423) .. (-0.3839, 0.0036) + --cycle + (-0.2480, 0.0970) + -- (-0.2480, 0.0800) + -- (-0.2056, 0.0800) + -- (-0.2056, 0.0970) + --cycle + (-0.1292, 0.0970) + -- (-0.1462, 0.0800) + -- (-0.1462, 0.0715) + -- (-0.1292, 0.0546) + -- (-0.1208, 0.0546) + -- (-0.1038, 0.0715) + --cycle + ( 0.3801, 0.0800) + -- ( 0.3801, 0.0206) + -- ( 0.3971, 0.0206) + -- ( 0.4056, 0.0291) + -- ( 0.4140, 0.0800) + --cycle + ( 0.4225, 0.0800) + .. controls ( 0.4316, 0.0456) and ( 0.4332, 0.0381) .. ( 0.4649, 0.0206) + .. controls ( 0.4618, 0.0591) and ( 0.4606, 0.0679) .. ( 0.4225, 0.0800) + --cycle + ( 0.8809, 0.0759) + .. controls ( 0.8722, 0.0759) and ( 0.8634, 0.0659) .. ( 0.8554, 0.0461) + -- ( 0.9064, 0.0461) + .. controls ( 0.8984, 0.0659) and ( 0.8897, 0.0759) .. ( 0.8809, 0.0759) + --cycle + ( 0.1413, 0.0752) + .. controls ( 0.1324, 0.0761) and ( 0.1215, 0.0749) .. ( 0.1084, 0.0715) + .. controls ( 0.1253, 0.0362) and ( 0.1326, 0.0290) .. ( 0.1679, 0.0121) + .. controls ( 0.1762, 0.0511) and ( 0.1679, 0.0726) .. ( 0.1413, 0.0752) + --cycle + (-0.7409, 0.0649) + .. controls (-0.7448, 0.0648) and (-0.7485, 0.0639) .. (-0.7518, 0.0618) + .. controls (-0.7690, 0.0508) and (-0.7544,-0.0147) .. (-0.7438,-0.0279) + .. controls (-0.7341,-0.0398) and (-0.7273,-0.0409) .. (-0.7149,-0.0473) + -- (-0.7065, 0.0546) + .. controls (-0.7159, 0.0583) and (-0.7292, 0.0653) .. (-0.7409, 0.0649) + --cycle + ( 0.9762, 0.0591) + -- ( 0.9564, 0.0203) + .. controls ( 0.9517,-0.0013) and ( 0.9637,-0.0270) .. ( 0.9761,-0.0510) + -- ( 0.9997,-0.0105) + .. controls ( 1.0000,-0.0010) and ( 1.0000, 0.0075) .. ( 0.9998, 0.0171) + --cycle + (-0.1717, 0.0546) + .. controls (-0.2038, 0.0492) and (-0.2042, 0.0472) .. (-0.2226, 0.0206) + -- (-0.1717, 0.0206) + --cycle + ( 0.7281, 0.0546) + -- ( 0.6687, 0.0461) + -- ( 0.6687, 0.0291) + .. controls ( 0.7027, 0.0233) and ( 0.7100, 0.0245) .. ( 0.7281, 0.0546) + --cycle + (-0.9726, 0.0477) + .. controls (-0.9758, 0.0477) and (-0.9806, 0.0473) .. (-0.9843, 0.0471) + -- (-1.0000, 0.0201) + -- (-0.9912, 0.0044) + -- (-0.9696, 0.0206) + -- (-0.9448,-0.0784) + -- (-0.9432,-0.0812) + -- (-0.8422,-0.0728) + -- (-0.8677,-0.0982) + -- (-0.8677,-0.1322) + .. controls (-0.8159,-0.1280) and (-0.7904,-0.1016) .. (-0.8308,-0.0569) + .. controls (-0.8618,-0.0226) and (-0.8917,-0.0142) .. (-0.9356,-0.0049) + .. controls (-0.9393, 0.0402) and (-0.9477, 0.0479) .. (-0.9726, 0.0477) + --cycle + (-0.0273, 0.0430) + .. controls (-0.1037, 0.0283) and (-0.0659,-0.0617) .. (-0.0043, 0.0049) + .. controls ( 0.0066, 0.0167) and ( 0.0086, 0.0240) .. ( 0.0151, 0.0376) + .. controls ( 0.0001, 0.0416) and (-0.0110, 0.0461) .. (-0.0273, 0.0430) + --cycle + ( 0.2361, 0.0409) + .. controls ( 0.2189, 0.0454) and ( 0.2022, 0.0366) .. ( 0.2018, 0.0036) + .. controls ( 0.2379, 0.0017) and ( 0.2409,-0.0057) .. ( 0.2527,-0.0388) + .. controls ( 0.2946,-0.0103) and ( 0.2647, 0.0336) .. ( 0.2361, 0.0409) + --cycle + (-0.2852, 0.0389) + .. controls (-0.3005, 0.0379) and (-0.3023, 0.0289) .. (-0.2990, 0.0036) + -- (-0.2650, 0.0376) + .. controls (-0.2735, 0.0387) and (-0.2801, 0.0393) .. (-0.2852, 0.0389) + --cycle + ( 0.3037, 0.0291) + .. controls ( 0.3231,-0.0055) and ( 0.3338,-0.0035) .. ( 0.3716,-0.0049) + .. controls ( 0.3519, 0.0279) and ( 0.3402, 0.0269) .. ( 0.3037, 0.0291) + --cycle + (-0.8206, 0.0192) + .. controls (-0.8430,-0.0126) and (-0.8179,-0.0291) .. (-0.8045,-0.0204) + .. controls (-0.7923,-0.0127) and (-0.7854, 0.0239) .. (-0.8206, 0.0192) + --cycle + (-0.1371, 0.0134) + .. controls (-0.1438, 0.0114) and (-0.1493, 0.0019) .. (-0.1547,-0.0134) + -- (-0.1123,-0.0049) + .. controls (-0.1224, 0.0099) and (-0.1303, 0.0154) .. (-0.1371, 0.0134) + --cycle + ( 0.7536, 0.0121) + -- ( 0.7111, 0.0036) + -- ( 0.7111,-0.0304) + .. controls ( 0.7469,-0.0274) and ( 0.7588,-0.0268) .. ( 0.7536, 0.0121) + --cycle + ( 0.0750, 0.0106) + .. controls ( 0.0661, 0.0093) and ( 0.0570, 0.0067) .. ( 0.0490, 0.0036) + .. controls ( 0.0651,-0.0248) and ( 0.0680,-0.0250) .. ( 0.1000,-0.0304) + .. controls ( 0.0590,-0.0732) and ( 0.0241,-0.0913) .. ( 0.0745,-0.1492) + .. controls ( 0.1110,-0.1331) and ( 0.1272,-0.1362) .. ( 0.1424,-0.0982) + -- ( 0.1339,-0.0897) + -- ( 0.1000,-0.0982) + .. controls ( 0.1057,-0.0835) and ( 0.1261,-0.0416) .. ( 0.1266,-0.0304) + .. controls ( 0.1284, 0.0069) and ( 0.1019, 0.0144) .. ( 0.0750, 0.0106) + --cycle + (-0.2311, 0.0036) + -- (-0.2311,-0.0049) + -- (-0.2480,-0.0219) + .. controls (-0.2373,-0.0386) and (-0.2259,-0.0581) .. (-0.2054,-0.0643) + .. controls (-0.1781,-0.0725) and (-0.1665,-0.0457) .. (-0.1984,-0.0158) + .. controls (-0.2100,-0.0050) and (-0.2177,-0.0027) .. (-0.2311, 0.0036) + --cycle + ( 0.8469, 0.0036) + .. controls ( 0.8030,-0.0174) and ( 0.7970,-0.0343) .. ( 0.7706,-0.0728) + .. controls ( 0.7934,-0.1060) and ( 0.7994,-0.1083) .. ( 0.8384,-0.0982) + -- ( 0.8384,-0.0813) + -- ( 0.8130,-0.0728) + -- ( 0.8130,-0.0558) + .. controls ( 0.8448,-0.0370) and ( 0.8501,-0.0340) .. ( 0.8469, 0.0036) + --cycle + (-0.4603,-0.0049) + .. controls (-0.4831,-0.0157) and (-0.5088,-0.0301) .. (-0.5182,-0.0557) + .. controls (-0.5278,-0.0816) and (-0.5057,-0.0969) .. (-0.4907,-0.0883) + .. controls (-0.4763,-0.0802) and (-0.4829,-0.0617) .. (-0.4518,-0.0304) + -- (-0.4518,-0.0134) + --cycle + ( 0.4264,-0.0112) + .. controls ( 0.3999,-0.0108) and ( 0.3834,-0.0280) .. ( 0.4056,-0.0728) + -- ( 0.4565,-0.0558) + -- ( 0.4649,-0.1237) + -- ( 0.4819,-0.1237) + -- ( 0.5074,-0.0558) + .. controls ( 0.4895,-0.0297) and ( 0.4529,-0.0116) .. ( 0.4264,-0.0112) + --cycle + (-0.5706,-0.0134) + -- (-0.6045,-0.0388) + .. controls (-0.6509,-0.0147) and (-0.6809,-0.0236) .. (-0.6725,-0.0813) + -- (-0.6980,-0.0897) + .. controls (-0.6821,-0.1195) and (-0.6788,-0.1210) .. (-0.6470,-0.1322) + .. controls (-0.6222,-0.0713) and (-0.6544,-0.0848) .. (-0.6130,-0.0473) + .. controls (-0.5953,-0.0788) and (-0.5888,-0.0784) .. (-0.5536,-0.0813) + --cycle + ( 0.1679,-0.0219) + .. controls ( 0.1573,-0.0941) and ( 0.2349,-0.1063) .. ( 0.2526,-0.0847) + .. controls ( 0.2609,-0.0744) and ( 0.2602,-0.0596) .. ( 0.2612,-0.0473) + --cycle + (-0.3112,-0.0274) + .. controls (-0.3586,-0.0281) and (-0.4163,-0.0558) .. (-0.4212,-0.0609) + .. controls (-0.4295,-0.0692) and (-0.4319,-0.0787) .. (-0.4327,-0.0899) + -- (-0.4327,-0.1492) + -- (-0.4327,-0.2086) + .. controls (-0.3777,-0.1999) and (-0.3244,-0.1312) .. (-0.4008,-0.1067) + -- (-0.3823,-0.0879) + .. controls (-0.3347,-0.0526) and (-0.3277,-0.1099) .. (-0.2903,-0.1163) + .. controls (-0.2612,-0.1213) and (-0.2444,-0.0914) .. (-0.2507,-0.0659) + .. controls (-0.2581,-0.0362) and (-0.2828,-0.0269) .. (-0.3112,-0.0274) + --cycle + ( 0.9234,-0.0304) + -- ( 0.9149,-0.0643) + -- ( 0.9488,-0.0558) + -- ( 0.9488,-0.0388) + -- ( 0.9403,-0.0304) + --cycle + ( 0.6406,-0.0369) + .. controls ( 0.6333,-0.0375) and ( 0.6251,-0.0419) .. ( 0.6177,-0.0522) + .. controls ( 0.6105,-0.0620) and ( 0.6112,-0.0704) .. ( 0.6093,-0.0799) + -- ( 0.6342,-0.0799) + .. controls ( 0.6760,-0.0673) and ( 0.6625,-0.0350) .. ( 0.6406,-0.0369) + --cycle + (-0.0016,-0.0449) + .. controls (-0.0461,-0.0548) and (-0.0410,-0.0663) .. (-0.0297,-0.1043) + .. controls (-0.0250,-0.1199) and (-0.0232,-0.1440) .. (-0.0016,-0.1422) + .. controls ( 0.0349,-0.1392) and ( 0.0554,-0.0537) .. (-0.0016,-0.0449) + --cycle + (-0.1123,-0.0473) + -- (-0.1208,-0.1067) + .. controls (-0.0719,-0.1062) and (-0.0661,-0.0635) .. (-0.1123,-0.0473) + --cycle + ( 0.3037,-0.0473) + .. controls ( 0.3198,-0.0756) and ( 0.3223,-0.0769) .. ( 0.3546,-0.0728) + .. controls ( 0.3383,-0.0447) and ( 0.3358,-0.0446) .. ( 0.3037,-0.0473) + --cycle + ( 0.5329,-0.0473) + .. controls ( 0.5004,-0.0966) and ( 0.4981,-0.1266) .. ( 0.5668,-0.1322) + -- ( 0.5499,-0.0473) + --cycle + (-0.1632,-0.0728) + -- (-0.1462,-0.1067) + -- (-0.1462,-0.0728) + --cycle + ( 0.7090,-0.0817) + .. controls ( 0.6987,-0.0843) and ( 0.6911,-0.0952) .. ( 0.6894,-0.1068) + .. controls ( 0.6863,-0.1276) and ( 0.7043,-0.1387) .. ( 0.7111,-0.1831) + .. controls ( 0.7499,-0.1786) and ( 0.7602,-0.1760) .. ( 0.7791,-0.1407) + -- ( 0.7196,-0.1322) + -- ( 0.7451,-0.1068) + .. controls ( 0.7324,-0.0850) and ( 0.7193,-0.0791) .. ( 0.7090,-0.0817) + --cycle + ( 0.9485,-0.0984) + .. controls ( 0.9284,-0.1094) and ( 0.8781,-0.1542) .. ( 0.8706,-0.1754) + .. controls ( 0.8655,-0.1897) and ( 0.8704,-0.2051) .. ( 0.8817,-0.2131) + --cycle + (-0.9323,-0.1007) + -- (-0.9101,-0.1405) + .. controls (-0.9101,-0.1287) and (-0.9146,-0.1173) .. (-0.9187,-0.1067) + --cycle + (-0.0528,-0.1067) + .. controls (-0.0616,-0.1167) and (-0.0681,-0.1217) .. (-0.0735,-0.1348) + .. controls (-0.0802,-0.1513) and (-0.0835,-0.2032) .. (-0.0603,-0.2082) + .. controls (-0.0462,-0.2108) and (-0.0167,-0.1971) .. (-0.0603,-0.1577) + .. controls (-0.0459,-0.1339) and (-0.0396,-0.1326) .. (-0.0528,-0.1067) + --cycle + (-0.4876,-0.1114) + .. controls (-0.4992,-0.1127) and (-0.5150,-0.1170) .. (-0.5367,-0.1237) + -- (-0.5367,-0.1577) + -- (-0.4433,-0.1916) + .. controls (-0.4544,-0.1299) and (-0.4526,-0.1074) .. (-0.4876,-0.1114) + --cycle + (-0.7635,-0.1120) + .. controls (-0.7788,-0.1114) and (-0.7890,-0.1295) .. (-0.7913,-0.1577) + -- (-0.7574,-0.1577) + .. controls (-0.7442,-0.2093) and (-0.7301,-0.2080) .. (-0.6810,-0.2086) + -- (-0.6810,-0.1746) + -- (-0.7149,-0.1916) + .. controls (-0.7175,-0.1714) and (-0.7177,-0.1520) .. (-0.7311,-0.1350) + .. controls (-0.7433,-0.1194) and (-0.7544,-0.1124) .. (-0.7635,-0.1120) + --cycle + (-0.2082,-0.1145) + .. controls (-0.2215,-0.1126) and (-0.2378,-0.1199) .. (-0.2495,-0.1410) + .. controls (-0.2530,-0.1510) and (-0.2546,-0.1612) .. (-0.2495,-0.1721) + .. controls (-0.2475,-0.1840) and (-0.2388,-0.1913) .. (-0.2311,-0.2001) + .. controls (-0.2202,-0.1931) and (-0.2111,-0.1884) .. (-0.2020,-0.1785) + .. controls (-0.1722,-0.1464) and (-0.1860,-0.1177) .. (-0.2082,-0.1145) + --cycle + ( 0.4225,-0.1152) + -- ( 0.3631,-0.1492) + -- ( 0.3801,-0.1831) + .. controls ( 0.4160,-0.1656) and ( 0.4276,-0.1565) .. ( 0.4225,-0.1152) + --cycle + (-0.5925,-0.1174) + .. controls (-0.6021,-0.1151) and (-0.6144,-0.1208) .. (-0.6203,-0.1336) + .. controls (-0.6283,-0.1508) and (-0.6192,-0.1674) .. (-0.6130,-0.1831) + -- (-0.5961,-0.1831) + .. controls (-0.5903,-0.1723) and (-0.5831,-0.1615) .. (-0.5803,-0.1494) + .. controls (-0.5758,-0.1301) and (-0.5828,-0.1197) .. (-0.5925,-0.1174) + --cycle + ( 0.2952,-0.1237) + -- ( 0.3292,-0.1746) + -- ( 0.3377,-0.1746) + -- ( 0.3546,-0.1577) + .. controls ( 0.3339,-0.1275) and ( 0.3315,-0.1266) .. ( 0.2952,-0.1237) + --cycle + ( 0.1832,-0.1240) + .. controls ( 0.1608,-0.1263) and ( 0.1298,-0.1544) .. ( 0.1254,-0.2086) + .. controls ( 0.1747,-0.2011) and ( 0.2191,-0.1503) .. ( 0.2015,-0.1301) + .. controls ( 0.1972,-0.1252) and ( 0.1907,-0.1232) .. ( 0.1832,-0.1240) + --cycle + (-0.3330,-0.1407) + .. controls (-0.3325,-0.1552) and (-0.3330,-0.1683) .. (-0.3280,-0.1824) + .. controls (-0.3221,-0.1993) and (-0.2907,-0.2626) .. (-0.2674,-0.2496) + .. controls (-0.2290,-0.2283) and (-0.2939,-0.1556) .. (-0.3330,-0.1407) + --cycle + (-0.8677,-0.1492) + .. controls (-0.8906,-0.2074) and (-0.8704,-0.2079) .. (-0.8168,-0.2086) + -- (-0.8168,-0.2341) + -- (-0.7828,-0.2341) + .. controls (-0.7876,-0.1754) and (-0.8159,-0.1679) .. (-0.8677,-0.1492) + --cycle + ( 0.6507,-0.1523) + .. controls ( 0.6150,-0.1514) and ( 0.5790,-0.1648) .. ( 0.5634,-0.2019) + .. controls ( 0.5467,-0.2418) and ( 0.5701,-0.2915) .. ( 0.6347,-0.2595) + -- ( 0.5923,-0.2426) + .. controls ( 0.6167,-0.1901) and ( 0.6349,-0.1909) .. ( 0.6857,-0.1746) + -- ( 0.6857,-0.1577) + .. controls ( 0.6745,-0.1545) and ( 0.6627,-0.1526) .. ( 0.6507,-0.1523) + --cycle + ( 0.4992,-0.1530) + .. controls ( 0.4893,-0.1544) and ( 0.4788,-0.1613) .. ( 0.4723,-0.1757) + .. controls ( 0.4601,-0.2024) and ( 0.4716,-0.2265) .. ( 0.4819,-0.2510) + -- ( 0.4310,-0.2510) + .. controls ( 0.4659,-0.3129) and ( 0.5002,-0.2692) .. ( 0.5329,-0.2341) + .. controls ( 0.5195,-0.1890) and ( 0.5320,-0.1766) .. ( 0.5232,-0.1628) + .. controls ( 0.5186,-0.1555) and ( 0.5091,-0.1515) .. ( 0.4992,-0.1530) + --cycle + (-0.1462,-0.1577) + -- (-0.1462,-0.2001) + -- (-0.1292,-0.2001) + -- (-0.1292,-0.1577) + --cycle + ( 0.0490,-0.1577) + -- ( 0.0066,-0.1831) + -- ( 0.0066,-0.2001) + .. controls ( 0.0224,-0.2077) and ( 0.0639,-0.2307) .. ( 0.0802,-0.2267) + .. controls ( 0.1236,-0.2159) and ( 0.0615,-0.1657) .. ( 0.0490,-0.1577) + --cycle + ( 0.2527,-0.1577) + -- ( 0.2358,-0.1746) + -- ( 0.2273,-0.1746) + -- ( 0.2273,-0.1916) + .. controls ( 0.2817,-0.2389) and ( 0.2612,-0.2548) .. ( 0.3207,-0.2595) + -- ( 0.2952,-0.2341) + .. controls ( 0.2952,-0.1946) and ( 0.2813,-0.1829) .. ( 0.2527,-0.1577) + --cycle + ( 0.4124,-0.1906) + .. controls ( 0.3901,-0.1934) and ( 0.3801,-0.2077) .. ( 0.3631,-0.2341) + .. controls ( 0.4031,-0.2391) and ( 0.4075,-0.2303) .. ( 0.4395,-0.2086) + -- ( 0.4395,-0.1916) + .. controls ( 0.4286,-0.1900) and ( 0.4198,-0.1897) .. ( 0.4124,-0.1906) + --cycle + (-0.5282,-0.1916) + -- (-0.5536,-0.2001) + -- (-0.5282,-0.2171) + --cycle + (-0.6045,-0.2001) + .. controls (-0.6700,-0.2056) and (-0.6485,-0.2287) .. (-0.6330,-0.2741) + .. controls (-0.6243,-0.2991) and (-0.6268,-0.3013) .. (-0.6130,-0.3274) + .. controls (-0.5769,-0.3048) and (-0.5602,-0.2946) .. (-0.5536,-0.2510) + -- (-0.6045,-0.2510) + --cycle + (-0.3584,-0.2086) + .. controls (-0.3921,-0.2259) and (-0.3939,-0.2318) .. (-0.4008,-0.2680) + .. controls (-0.4235,-0.2397) and (-0.4237,-0.2318) .. (-0.4603,-0.2256) + -- (-0.4603,-0.2850) + .. controls (-0.4267,-0.2892) and (-0.3194,-0.3199) .. (-0.3429,-0.2424) + --cycle + ( 0.7960,-0.2086) + -- ( 0.8384,-0.2510) + .. controls ( 0.8428,-0.2169) and ( 0.8301,-0.2042) .. ( 0.7960,-0.2086) + --cycle + ( 0.1928,-0.2162) + .. controls ( 0.1816,-0.2174) and ( 0.1689,-0.2258) .. ( 0.1598,-0.2322) + .. controls ( 0.1191,-0.2606) and ( 0.1214,-0.2831) .. ( 0.1339,-0.3274) + -- ( 0.1509,-0.3274) + .. controls ( 0.1561,-0.3114) and ( 0.1614,-0.2848) .. ( 0.1729,-0.2730) + .. controls ( 0.1867,-0.2591) and ( 0.2098,-0.2594) .. ( 0.2174,-0.2461) + .. controls ( 0.2253,-0.2321) and ( 0.2130,-0.2142) .. ( 0.1928,-0.2162) + --cycle + (-0.1905,-0.2188) + .. controls (-0.1970,-0.2195) and (-0.2037,-0.2233) .. (-0.2087,-0.2284) + .. controls (-0.2248,-0.2451) and (-0.2297,-0.2881) .. (-0.2311,-0.3104) + -- (-0.1801,-0.3104) + .. controls (-0.1960,-0.2531) and (-0.1611,-0.2530) .. (-0.1738,-0.2284) + .. controls (-0.1778,-0.2206) and (-0.1840,-0.2181) .. (-0.1905,-0.2188) + --cycle + (-0.5112,-0.2256) + -- (-0.5112,-0.2595) + -- (-0.4772,-0.2595) + -- (-0.4772,-0.2256) + --cycle + ( 0.7451,-0.2256) + -- ( 0.6687,-0.2341) + -- ( 0.6602,-0.2426) + .. controls ( 0.6862,-0.3159) and ( 0.7361,-0.2848) .. ( 0.7451,-0.2256) + --cycle + (-0.8578,-0.2336) + -- (-0.8203,-0.3006) + .. controls (-0.7747,-0.3108) and (-0.8112,-0.2349) .. (-0.8578,-0.2336) + --cycle + (-0.0280,-0.2369) + .. controls (-0.0529,-0.2386) and (-0.0646,-0.2625) .. (-0.0273,-0.3019) + -- ( 0.0236,-0.2595) + .. controls ( 0.0068,-0.2430) and (-0.0130,-0.2359) .. (-0.0280,-0.2369) + --cycle + (-0.7234,-0.2510) + .. controls (-0.7141,-0.2750) and (-0.7050,-0.2842) .. (-0.6810,-0.2935) + -- (-0.6725,-0.2850) + .. controls (-0.6853,-0.2530) and (-0.6899,-0.2536) .. (-0.7234,-0.2510) + --cycle + ( 0.0504,-0.2510) + -- ( 0.0504,-0.2760) + .. controls ( 0.0689,-0.3381) and ( 0.1243,-0.2780) .. ( 0.0804,-0.2561) + .. controls ( 0.0707,-0.2513) and ( 0.0594,-0.2519) .. ( 0.0504,-0.2510) + --cycle + (-0.1292,-0.2595) + -- (-0.1462,-0.2765) + -- (-0.1038,-0.3274) + -- (-0.0953,-0.3274) + -- (-0.0783,-0.3104) + --cycle + ( 0.7877,-0.2632) + .. controls ( 0.7523,-0.2682) and ( 0.7335,-0.3052) .. ( 0.7960,-0.3359) + .. controls ( 0.8015,-0.3335) and ( 0.8068,-0.3333) .. ( 0.8122,-0.3324) + -- ( 0.8442,-0.2774) + .. controls ( 0.8248,-0.2696) and ( 0.8026,-0.2612) .. ( 0.7877,-0.2632) + --cycle + ( 0.5329,-0.2765) + .. controls ( 0.5358,-0.3116) and ( 0.5353,-0.3182) .. ( 0.5668,-0.3359) + .. controls ( 0.5639,-0.3008) and ( 0.5644,-0.2942) .. ( 0.5329,-0.2765) + --cycle + ( 0.3385,-0.2820) + .. controls ( 0.3148,-0.2878) and ( 0.2673,-0.3492) .. ( 0.3385,-0.3614) + -- ( 0.3122,-0.4038) + .. controls ( 0.3574,-0.4463) and ( 0.3787,-0.4004) .. ( 0.3701,-0.3806) + .. controls ( 0.3644,-0.3672) and ( 0.3492,-0.3602) .. ( 0.3377,-0.3529) + -- ( 0.3886,-0.3019) + .. controls ( 0.3746,-0.2928) and ( 0.3572,-0.2777) .. ( 0.3385,-0.2820) + --cycle + (-0.3075,-0.2850) + -- (-0.3669,-0.3359) + .. controls (-0.3237,-0.3346) and (-0.3194,-0.3327) .. (-0.2820,-0.3104) + --cycle + ( 0.6347,-0.2850) + -- ( 0.6093,-0.3359) + -- ( 0.6687,-0.3359) + .. controls ( 0.6634,-0.3038) and ( 0.6614,-0.3034) .. ( 0.6347,-0.2850) + --cycle + ( 0.2482,-0.2927) + .. controls ( 0.2430,-0.2922) and ( 0.2370,-0.2926) .. ( 0.2301,-0.2942) + .. controls ( 0.1967,-0.3336) and ( 0.2478,-0.3609) .. ( 0.2647,-0.3515) + .. controls ( 0.2796,-0.3431) and ( 0.2843,-0.2960) .. ( 0.2482,-0.2927) + --cycle + (-0.5371,-0.2933) + .. controls (-0.5481,-0.2970) and (-0.5577,-0.3098) .. (-0.5621,-0.3359) + -- (-0.5112,-0.3869) + .. controls (-0.4600,-0.3526) and (-0.5043,-0.2822) .. (-0.5371,-0.2933) + --cycle + (-0.4433,-0.3019) + .. controls (-0.4430,-0.3328) and (-0.4401,-0.3356) .. (-0.4093,-0.3359) + -- (-0.4263,-0.3019) + --cycle + ( 0.0236,-0.3104) + -- ( 0.0066,-0.3274) + -- ( 0.0066,-0.3359) + -- ( 0.0236,-0.3529) + -- ( 0.0321,-0.3529) + -- ( 0.0490,-0.3359) + --cycle + ( 0.4140,-0.3104) + -- ( 0.4140,-0.3274) + -- ( 0.4565,-0.3274) + -- ( 0.4565,-0.3104) + --cycle + (-0.6555,-0.3189) + .. controls (-0.7282,-0.3463) and (-0.7047,-0.4238) .. (-0.6385,-0.3614) + --cycle + (-0.7635,-0.3203) + .. controls (-0.7897,-0.3491) and (-0.7645,-0.3586) .. (-0.7512,-0.3515) + .. controls (-0.7383,-0.3446) and (-0.7269,-0.3159) .. (-0.7635,-0.3203) + --cycle + (-0.1547,-0.3359) + .. controls (-0.2375,-0.3951) and (-0.1886,-0.3975) .. (-0.2106,-0.4536) + .. controls (-0.2221,-0.4826) and (-0.2548,-0.4886) .. (-0.2435,-0.5309) + .. controls (-0.2373,-0.5540) and (-0.1692,-0.6520) .. (-0.1548,-0.5893) + .. controls (-0.1503,-0.5696) and (-0.1713,-0.5323) .. (-0.1801,-0.5141) + -- (-0.2141,-0.5141) + -- (-0.1801,-0.4836) + -- (-0.1632,-0.3784) + -- (-0.1292,-0.3614) + --cycle + ( 0.5838,-0.3444) + -- ( 0.6178,-0.3869) + .. controls ( 0.6126,-0.3569) and ( 0.6121,-0.3558) .. ( 0.5838,-0.3444) + --cycle + (-0.5876,-0.3529) + -- (-0.5876,-0.3869) + -- (-0.5536,-0.3869) + --cycle + (-0.3075,-0.3529) + .. controls (-0.3075,-0.4259) and (-0.3150,-0.4459) .. (-0.2480,-0.4378) + .. controls (-0.2520,-0.3893) and (-0.2634,-0.3741) .. (-0.3075,-0.3529) + --cycle + ( 0.0745,-0.3529) + .. controls ( 0.0603,-0.3977) and ( 0.0512,-0.3786) .. ( 0.0066,-0.3869) + .. controls ( 0.0321,-0.4377) and ( 0.0562,-0.4373) .. ( 0.1084,-0.4378) + -- ( 0.1254,-0.3614) + --cycle + ( 0.1868,-0.3534) + .. controls ( 0.1605,-0.3550) and ( 0.1563,-0.3921) .. ( 0.1681,-0.4095) + .. controls ( 0.1887,-0.4397) and ( 0.2596,-0.3970) .. ( 0.2782,-0.3784) + .. controls ( 0.2016,-0.3640) and ( 0.2352,-0.3656) .. ( 0.1995,-0.3551) + .. controls ( 0.1948,-0.3537) and ( 0.1906,-0.3532) .. ( 0.1868,-0.3534) + --cycle + (-0.0650,-0.3585) + .. controls (-0.0712,-0.3584) and (-0.0783,-0.3594) .. (-0.0865,-0.3617) + .. controls (-0.1407,-0.4045) and (-0.1029,-0.4414) .. (-0.0731,-0.4301) + .. controls (-0.0250,-0.4118) and (-0.0217,-0.3591) .. (-0.0650,-0.3585) + --cycle + (-0.4008,-0.3614) + -- (-0.3584,-0.4293) + .. controls (-0.3814,-0.4389) and (-0.3792,-0.4389) .. (-0.3839,-0.4632) + .. controls (-0.3078,-0.4504) and (-0.3334,-0.3529) .. (-0.4008,-0.3614) + --cycle + ( 0.7706,-0.3784) + -- ( 0.6689,-0.4004) + -- ( 0.6602,-0.4378) + .. controls ( 0.6990,-0.4346) and ( 0.7019,-0.4328) .. ( 0.7281,-0.4038) + .. controls ( 0.7344,-0.4232) and ( 0.7382,-0.4373) .. ( 0.7461,-0.4460) + -- ( 0.7747,-0.3969) + --cycle + (-0.7404,-0.3869) + -- (-0.7574,-0.4038) + .. controls (-0.7352,-0.4249) and (-0.7368,-0.4246) .. (-0.7065,-0.4208) + -- (-0.7065,-0.4038) + --cycle + ( 0.3971,-0.3953) + -- ( 0.3801,-0.4378) + -- ( 0.4140,-0.4378) + -- ( 0.4140,-0.3953) + --cycle + (-0.6640,-0.4038) + .. controls (-0.6429,-0.4478) and (-0.6261,-0.4537) .. (-0.5876,-0.4802) + -- (-0.5367,-0.4378) + .. controls (-0.5592,-0.4163) and (-0.5680,-0.4098) .. (-0.5876,-0.4378) + .. controls (-0.6195,-0.4110) and (-0.6224,-0.4072) .. (-0.6640,-0.4038) + --cycle + (-0.4603,-0.4038) + -- (-0.4603,-0.4378) + -- (-0.4263,-0.4378) + -- (-0.4263,-0.4038) + --cycle + ( 0.5584,-0.4038) + .. controls ( 0.5189,-0.4043) and ( 0.5111,-0.4167) .. ( 0.5159,-0.4548) + -- ( 0.5329,-0.4548) + --cycle + ( 0.6093,-0.4123) + -- ( 0.6008,-0.4378) + -- ( 0.6262,-0.4378) + --cycle + ( 0.2273,-0.4293) + -- ( 0.2273,-0.4632) + -- ( 0.2612,-0.4632) + -- ( 0.2612,-0.4293) + --cycle + ( 0.1339,-0.4378) + .. controls ( 0.1294,-0.4715) and ( 0.1342,-0.4762) .. ( 0.1679,-0.4717) + --cycle + (-0.1337,-0.4435) + .. controls (-0.1394,-0.4438) and (-0.1452,-0.4454) .. (-0.1547,-0.4474) + -- (-0.1547,-0.4632) + -- (-0.1038,-0.4972) + -- (-0.1547,-0.5057) + .. controls (-0.1508,-0.5315) and (-0.1180,-0.5928) .. (-0.0833,-0.5723) + .. controls (-0.0768,-0.5684) and (-0.0244,-0.4827) .. (-0.1123,-0.4474) + .. controls (-0.1220,-0.4442) and (-0.1279,-0.4432) .. (-0.1337,-0.4435) + --cycle + (-0.0033,-0.4457) + .. controls (-0.0284,-0.4445) and (-0.0459,-0.4662) .. (-0.0273,-0.5141) + -- ( 0.0660,-0.5141) + .. controls ( 0.0545,-0.4708) and ( 0.0219,-0.4468) .. (-0.0033,-0.4457) + --cycle + (-0.7383,-0.4470) + -- (-0.7101,-0.4972) + .. controls (-0.7099,-0.4756) and (-0.7233,-0.4577) .. (-0.7383,-0.4470) + --cycle + (-0.4942,-0.4548) + -- (-0.4857,-0.5065) + .. controls (-0.4998,-0.5043) and (-0.5212,-0.5004) .. (-0.5329,-0.5065) + .. controls (-0.5629,-0.5229) and (-0.5515,-0.5662) .. (-0.5329,-0.5843) + .. controls (-0.5068,-0.6075) and (-0.4879,-0.6033) .. (-0.4603,-0.5906) + .. controls (-0.4787,-0.5639) and (-0.4791,-0.5620) .. (-0.5112,-0.5566) + -- (-0.5112,-0.5396) + .. controls (-0.4518,-0.5306) and (-0.4206,-0.4773) .. (-0.4942,-0.4548) + --cycle + ( 0.3377,-0.4548) + .. controls ( 0.3023,-0.4717) and ( 0.2951,-0.4788) .. ( 0.2782,-0.5141) + .. controls ( 0.3342,-0.5180) and ( 0.3822,-0.5526) .. ( 0.3886,-0.4717) + -- ( 0.3631,-0.4972) + --cycle + ( 0.5663,-0.4671) + .. controls ( 0.5583,-0.4668) and ( 0.5478,-0.4680) .. ( 0.5329,-0.4717) + -- ( 0.5329,-0.4887) + .. controls ( 0.5814,-0.5209) and ( 0.6607,-0.5778) .. ( 0.6687,-0.4802) + -- ( 0.6201,-0.4852) + .. controls ( 0.5908,-0.4828) and ( 0.5901,-0.4680) .. ( 0.5663,-0.4671) + --cycle + (-0.6640,-0.4802) + .. controls (-0.6763,-0.5067) and (-0.6845,-0.5204) .. (-0.6886,-0.5355) + -- (-0.6647,-0.5782) + -- (-0.5876,-0.5396) + .. controls (-0.6003,-0.5515) and (-0.6232,-0.5710) .. (-0.6310,-0.5860) + .. controls (-0.6373,-0.5982) and (-0.6388,-0.6155) .. (-0.6360,-0.6294) + -- (-0.6224,-0.6537) + .. controls (-0.5951,-0.6768) and (-0.5385,-0.6561) .. (-0.5112,-0.6415) + .. controls (-0.5400,-0.5996) and (-0.5579,-0.6048) .. (-0.6045,-0.6161) + -- (-0.5621,-0.5651) + -- (-0.5621,-0.5566) + -- (-0.5791,-0.5481) + -- (-0.5621,-0.5141) + --cycle + ( 0.1000,-0.4802) + -- ( 0.0745,-0.5396) + .. controls ( 0.1186,-0.5345) and ( 0.1548,-0.5114) .. ( 0.1000,-0.4802) + --cycle + ( 0.2188,-0.4802) + -- ( 0.2358,-0.5141) + -- ( 0.2358,-0.4802) + --cycle + ( 0.4310,-0.4802) + -- ( 0.4140,-0.5311) + -- ( 0.4140,-0.5396) + -- ( 0.4310,-0.5566) + .. controls ( 0.4679,-0.5313) and ( 0.4644,-0.5230) .. ( 0.4649,-0.4802) + --cycle + ( 0.7111,-0.4802) + -- ( 0.7111,-0.5059) + -- ( 0.7261,-0.4802) + --cycle + (-0.3414,-0.4972) + .. controls (-0.3911,-0.5256) and (-0.3704,-0.5729) .. (-0.3075,-0.5566) + -- (-0.3075,-0.5396) + --cycle + (-0.4348,-0.5057) + -- (-0.4348,-0.5736) + .. controls (-0.4068,-0.5549) and (-0.4098,-0.5369) .. (-0.4008,-0.5057) + --cycle + ( 0.1509,-0.5311) + -- ( 0.1254,-0.5736) + -- ( 0.1849,-0.5651) + --cycle + ( 0.2273,-0.5311) + -- ( 0.2103,-0.5975) + .. controls ( 0.1971,-0.5957) and ( 0.1843,-0.5904) .. ( 0.1705,-0.5975) + .. controls ( 0.1304,-0.6124) and ( 0.1679,-0.7346) .. ( 0.2142,-0.6893) + .. controls ( 0.2226,-0.6812) and ( 0.2236,-0.6741) .. ( 0.2273,-0.6670) + -- ( 0.1849,-0.6330) + .. controls ( 0.2427,-0.6183) and ( 0.2598,-0.5884) .. ( 0.2443,-0.5311) + --cycle + ( 0.5074,-0.5311) + .. controls ( 0.5252,-0.5626) and ( 0.5317,-0.5622) .. ( 0.5668,-0.5651) + .. controls ( 0.5491,-0.5336) and ( 0.5426,-0.5340) .. ( 0.5074,-0.5311) + --cycle + ( 0.0269,-0.5388) + .. controls ( 0.0166,-0.5396) and ( 0.0072,-0.5496) .. ( 0.0090,-0.5738) + -- ( 0.0151,-0.5991) + .. controls ( 0.0222,-0.5954) and ( 0.0287,-0.5947) .. ( 0.0377,-0.5860) + .. controls ( 0.0637,-0.5611) and ( 0.0441,-0.5373) .. ( 0.0269,-0.5388) + --cycle + ( 0.2782,-0.5481) + -- ( 0.2612,-0.5821) + -- ( 0.3122,-0.6245) + .. controls ( 0.3120,-0.5837) and ( 0.3197,-0.5648) .. ( 0.2782,-0.5481) + --cycle + (-0.2820,-0.5566) + .. controls (-0.2791,-0.5918) and (-0.2795,-0.5983) .. (-0.2480,-0.6161) + .. controls (-0.2450,-0.5789) and (-0.2492,-0.5737) .. (-0.2820,-0.5566) + --cycle + ( 0.3631,-0.5651) + .. controls ( 0.3595,-0.5776) and ( 0.3566,-0.5855) .. ( 0.3557,-0.5990) + .. controls ( 0.3500,-0.6875) and ( 0.4541,-0.6501) .. ( 0.3934,-0.5846) + .. controls ( 0.3826,-0.5729) and ( 0.3761,-0.5717) .. ( 0.3631,-0.5651) + --cycle + ( 0.4330,-0.5736) + -- ( 0.4330,-0.6379) + .. controls ( 0.4274,-0.6731) and ( 0.3959,-0.6885) .. ( 0.4395,-0.7179) + .. controls ( 0.4751,-0.6405) and ( 0.4954,-0.6629) .. ( 0.4480,-0.5736) + --cycle + ( 0.5329,-0.5821) + .. controls ( 0.5362,-0.6232) and ( 0.5740,-0.6869) .. ( 0.6222,-0.6585) + -- ( 0.6513,-0.6086) + .. controls ( 0.6095,-0.6116) and ( 0.5939,-0.6354) .. ( 0.5668,-0.5821) + --cycle + ( 0.1000,-0.5906) + -- ( 0.0830,-0.6245) + -- ( 0.0575,-0.6161) + .. controls ( 0.0477,-0.6898) and ( 0.1617,-0.6541) .. ( 0.1000,-0.5906) + --cycle + (-0.3245,-0.5991) + .. controls (-0.3790,-0.5920) and (-0.3824,-0.6312) .. (-0.3839,-0.6754) + -- (-0.3245,-0.6161) + --cycle + (-0.4348,-0.6076) + -- (-0.4603,-0.6670) + -- (-0.4942,-0.6585) + -- (-0.5027,-0.6670) + .. controls (-0.4589,-0.7510) and (-0.3531,-0.6544) .. (-0.4348,-0.6076) + --cycle + (-0.1377,-0.6076) + .. controls (-0.1554,-0.6464) and (-0.1574,-0.6512) .. (-0.1292,-0.6839) + -- (-0.1208,-0.6839) + -- (-0.1038,-0.6670) + -- (-0.1208,-0.6076) + --cycle + (-0.0698,-0.6161) + -- (-0.0698,-0.6330) + -- (-0.0019,-0.6330) + -- (-0.0019,-0.6161) + --cycle + (-0.2735,-0.6330) + .. controls (-0.3246,-0.6408) and (-0.3550,-0.6906) .. (-0.3754,-0.7356) + -- (-0.3510,-0.7356) + -- (-0.2786,-0.6658) + --cycle + (-0.1971,-0.6330) + .. controls (-0.2393,-0.6535) and (-0.2774,-0.6931) .. (-0.2226,-0.7264) + --cycle + ( 0.2782,-0.6415) + -- ( 0.2612,-0.6585) + .. controls ( 0.2834,-0.6795) and ( 0.2819,-0.6792) .. ( 0.3122,-0.6754) + -- ( 0.3122,-0.6585) + --cycle + ( 0.5244,-0.6630) + .. controls ( 0.5103,-0.6630) and ( 0.4934,-0.6765) .. ( 0.4819,-0.6839) + .. controls ( 0.4916,-0.7019) and ( 0.4915,-0.7036) .. ( 0.5078,-0.7175) + -- ( 0.5293,-0.7332) + .. controls ( 0.6028,-0.7786) and ( 0.5789,-0.6636) .. ( 0.5244,-0.6630) + --cycle + (-0.0698,-0.6839) + -- (-0.0613,-0.7433) + -- (-0.0528,-0.7518) + .. controls (-0.0005,-0.7307) and (-0.0190,-0.6844) .. (-0.0698,-0.6839) + --cycle + ( 0.1339,-0.6839) + .. controls ( 0.0648,-0.6945) and ( 0.0512,-0.7734) .. ( 0.1169,-0.7943) + .. controls ( 0.1059,-0.7314) and ( 0.1116,-0.7410) .. ( 0.1339,-0.6839) + --cycle + ( 0.3546,-0.6839) + .. controls ( 0.3575,-0.7191) and ( 0.3571,-0.7256) .. ( 0.3886,-0.7433) + -- ( 0.3716,-0.6839) + --cycle + ( 0.3886,-0.7433) + -- ( 0.3886,-0.7603) + -- ( 0.3546,-0.7943) + -- ( 0.3631,-0.7943) + -- ( 0.3801,-0.8113) + .. controls ( 0.4252,-0.7878) and ( 0.4333,-0.7840) .. ( 0.4140,-0.7349) + --cycle + (-0.5653,-0.6922) + .. controls (-0.5767,-0.6913) and (-0.5873,-0.6939) .. (-0.5981,-0.6969) + -- (-0.5741,-0.7399) + .. controls (-0.5528,-0.7446) and (-0.5350,-0.7433) .. (-0.5027,-0.7433) + .. controls (-0.5172,-0.7077) and (-0.5409,-0.6942) .. (-0.5653,-0.6922) + --cycle + (-0.1547,-0.7099) + .. controls (-0.1719,-0.7103) and (-0.1811,-0.7133) .. (-0.1971,-0.7179) + .. controls (-0.1923,-0.7317) and (-0.1881,-0.7454) .. (-0.1792,-0.7574) + .. controls (-0.1162,-0.8422) and (-0.0444,-0.7079) .. (-0.1547,-0.7099) + --cycle + (-0.4348,-0.7179) + .. controls (-0.4394,-0.7549) and (-0.4359,-0.7636) .. (-0.4008,-0.7773) + --cycle + ( 0.2358,-0.7179) + -- ( 0.2358,-0.7349) + -- ( 0.3037,-0.7349) + -- ( 0.3037,-0.7179) + --cycle + ( 0.4649,-0.7179) + -- ( 0.4734,-0.7858) + .. controls ( 0.4612,-0.7900) and ( 0.4516,-0.7918) .. ( 0.4409,-0.8004) + .. controls ( 0.3964,-0.8360) and ( 0.4585,-0.8927) .. ( 0.4819,-0.8198) + -- ( 0.5159,-0.8283) + .. controls ( 0.5142,-0.8359) and ( 0.5131,-0.8417) .. ( 0.5125,-0.8468) + -- ( 0.5398,-0.8000) + .. controls ( 0.5329,-0.7638) and ( 0.5138,-0.7350) .. ( 0.4649,-0.7179) + --cycle + ( 0.2103,-0.7264) + -- ( 0.1509,-0.7349) + -- ( 0.1509,-0.7688) + .. controls ( 0.1894,-0.7657) and ( 0.1982,-0.7645) .. ( 0.2103,-0.7264) + --cycle + (-0.2905,-0.7349) + .. controls (-0.3009,-0.7717) and (-0.3009,-0.7829) .. (-0.2905,-0.8198) + -- (-0.2480,-0.8028) + -- (-0.2311,-0.8367) + .. controls (-0.1820,-0.7845) and (-0.2454,-0.7805) .. (-0.2735,-0.7349) + --cycle + (-0.0019,-0.7349) + .. controls (-0.0202,-0.7845) and (-0.0471,-0.8007) .. (-0.0358,-0.8537) + -- ( 0.0066,-0.8113) + -- ( 0.0236,-0.8113) + .. controls ( 0.0412,-0.8384) and ( 0.0421,-0.8410) .. ( 0.0745,-0.8367) + .. controls ( 0.0599,-0.7914) and ( 0.0500,-0.7437) .. (-0.0019,-0.7349) + --cycle + (-0.5282,-0.7688) + .. controls (-0.5349,-0.8205) and (-0.5012,-0.8219) .. (-0.4603,-0.8113) + -- (-0.4603,-0.7943) + --cycle + ( 0.3122,-0.7688) + -- ( 0.3037,-0.7773) + .. controls ( 0.3122,-0.8236) and ( 0.3093,-0.8598) .. ( 0.3608,-0.8698) + -- ( 0.3628,-0.8698) + -- ( 0.3292,-0.7688) + --cycle + (-0.3584,-0.7858) + -- (-0.3770,-0.8622) + .. controls (-0.3770,-0.8627) and (-0.3768,-0.8631) .. (-0.3768,-0.8636) + -- (-0.3401,-0.8639) + -- (-0.3245,-0.7858) + --cycle + ( 0.2612,-0.7858) + .. controls ( 0.2125,-0.7858) and ( 0.1976,-0.7780) .. ( 0.1594,-0.8113) + .. controls ( 0.2029,-0.8570) and ( 0.2552,-0.8596) .. ( 0.2612,-0.7858) + --cycle + (-0.1292,-0.7943) + -- (-0.1886,-0.8537) + .. controls (-0.1453,-0.8604) and (-0.1341,-0.8487) .. (-0.1038,-0.8198) + --cycle + (-0.4348,-0.8367) + -- (-0.4479,-0.8630) + -- (-0.4228,-0.8632) + .. controls (-0.4191,-0.8583) and (-0.4180,-0.8505) .. (-0.4178,-0.8367) + --cycle + (-0.0783,-0.8452) + .. controls (-0.0928,-0.8536) and (-0.0996,-0.8588) .. (-0.1026,-0.8659) + -- (-0.0748,-0.8661) + -- (-0.0698,-0.8537) + --cycle + ( 0.1503,-0.8501) + .. controls ( 0.1440,-0.8514) and ( 0.1387,-0.8545) .. ( 0.1353,-0.8602) + .. controls ( 0.1334,-0.8621) and ( 0.1330,-0.8649) .. ( 0.1333,-0.8679) + -- ( 0.2103,-0.8685) + -- ( 0.2103,-0.8602) + .. controls ( 0.1968,-0.8575) and ( 0.1690,-0.8460) .. ( 0.1503,-0.8501) + --cycle + (-0.2396,-0.8622) + -- (-0.2421,-0.8647) + -- (-0.2217,-0.8649) + .. controls (-0.2221,-0.8638) and (-0.2222,-0.8633) .. (-0.2226,-0.8622) + --cycle + ( 0.2867,-0.8622) + .. controls ( 0.2782,-0.8636) and ( 0.2734,-0.8665) .. ( 0.2676,-0.8690) + -- ( 0.2859,-0.8691) + --cycle + ( 0.3942,-0.8639) + .. controls ( 0.3909,-0.8650) and ( 0.3884,-0.8678) .. ( 0.3855,-0.8700) + -- ( 0.4192,-0.8703) + .. controls ( 0.4168,-0.8684) and ( 0.4154,-0.8656) .. ( 0.4124,-0.8643) + .. controls ( 0.4062,-0.8618) and ( 0.4000,-0.8619) .. ( 0.3942,-0.8639) + --cycle + ; + } +} +\fi +% \end{macrocode} +% \end{TikzKey} +% \iffalse +%</hex> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/hex/terrain/swamp.dtx b/macros/latex/contrib/wargame/source/hex/terrain/swamp.dtx new file mode 100644 index 0000000000..b361789fa3 --- /dev/null +++ b/macros/latex/contrib/wargame/source/hex/terrain/swamp.dtx @@ -0,0 +1,317 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*hex> +% \fi +% \begin{TikzKey}{hex/terrain/swamp} +% The pattern for swamps. The pattern is filled with a light blue. +% +% \begin{macrocode} +\tikzset{ + hex/terrain/swamp/.style={ + draw=none, + fill={rgb,100:red,26;green,55;blue,70} + } +} +% \end{macrocode} +% \end{TikzKey} +% +% \begin{TikzKey}{hex/terrain/swamp} +% Swamps. This is probably the shortest of the terrain patterns. +% +% \begin{macrocode} +\ifhex@terrain@pic +\tikzset{ + hex/terrain/swamp/.pic={ + \path[hex/terrain/swamp,pic actions,draw=none] + (-0.5026, 0.8699) + -- (-0.5041, 0.8672) + .. controls (-0.3586, 0.8441) and (-0.1148, 0.8722) .. ( 0.0006, 0.8697) + -- ( 0.2386, 0.8529) + -- ( 0.2386, 0.8699) + --cycle + ( 0.4257, 0.8699) + -- ( 0.4257, 0.8529) + -- ( 0.5112, 0.8558) + -- ( 0.5033, 0.8699) + --cycle + ( 0.3067, 0.8359) + -- ( 0.2897, 0.7848) + -- ( 0.2726, 0.8188) + -- ( 0.2556, 0.8188) + -- ( 0.2217, 0.7509) + -- ( 0.5719, 0.7509) + -- ( 0.5621, 0.7679) + -- ( 0.5617, 0.7679) + -- ( 0.3746, 0.7848) + -- ( 0.3746, 0.8359) + --cycle + (-0.3225, 0.7848) + -- (-0.3225, 0.7509) + -- ( 0.0856, 0.7509) + -- ( 0.0856, 0.7848) + --cycle + (-0.5555, 0.7782) + -- (-0.5713, 0.7509) + -- (-0.5097, 0.7509) + --cycle + ( 0.2789, 0.6696) + .. controls ( 0.2234, 0.6713) and ( 0.1659, 0.6658) .. ( 0.1195, 0.6658) + -- (-0.6117, 0.6658) + -- (-0.6117, 0.6318) + -- ( 0.4257, 0.6318) + .. controls ( 0.3878, 0.6597) and ( 0.3344, 0.6681) .. ( 0.2789, 0.6696) + --cycle + ( 0.6297, 0.6318) + -- ( 0.6297, 0.5468) + -- ( 0.5617, 0.5807) + .. controls ( 0.5449, 0.5387) and ( 0.5194, 0.5474) .. ( 0.4764, 0.5468) + -- ( 0.2047, 0.5468) + .. controls ( 0.2857, 0.5146) and ( 0.5508, 0.5135) .. ( 0.7089, 0.5136) + -- ( 0.6740, 0.5740) + -- ( 0.6638, 0.5637) + --cycle + (-0.6684, 0.5591) + .. controls (-0.6731, 0.5588) and (-0.6784, 0.5577) .. (-0.6832, 0.5571) + -- (-0.6990, 0.5298) + -- (-0.5777, 0.5298) + .. controls (-0.6139, 0.5561) and (-0.6407, 0.5608) .. (-0.6684, 0.5591) + --cycle + (-0.3396, 0.5468) + .. controls (-0.2194, 0.4991) and (-0.1285, 0.5826) .. (-0.0845, 0.4447) + -- (-0.1525, 0.4957) + -- (-0.1525, 0.4277) + .. controls (-0.0482, 0.4023) and ( 0.2732, 0.3989) .. ( 0.3746, 0.4277) + .. controls ( 0.2597, 0.4733) and ( 0.2397, 0.4045) .. ( 0.1026, 0.4957) + -- ( 0.0686, 0.4617) + -- ( 0.0516, 0.4617) + -- ( 0.0686, 0.5298) + -- ( 0.0006, 0.4447) + -- ( 0.0006, 0.5468) + --cycle + (-0.0675, 0.5127) + -- (-0.0164, 0.5127) + -- (-0.0505, 0.4447) + --cycle + (-0.7435, 0.4527) + -- (-0.7580, 0.4277) + -- (-0.6797, 0.4277) + .. controls (-0.6982, 0.4394) and (-0.7200, 0.4471) .. (-0.7435, 0.4527) + --cycle + (-0.5266, 0.4447) + .. controls (-0.4681, 0.4018) and (-0.4413, 0.4086) .. (-0.3736, 0.4277) + --cycle + ( 0.5787, 0.4277) + -- ( 0.5447, 0.3257) + -- ( 0.5108, 0.3257) + -- ( 0.4597, 0.4107) + -- ( 0.4597, 0.3257) + -- ( 0.4257, 0.3937) + -- ( 0.4087, 0.3257) + -- ( 0.2897, 0.3257) + .. controls ( 0.3725, 0.2928) and ( 0.6913, 0.3087) .. ( 0.7998, 0.3087) + .. controls ( 0.7426, 0.3376) and ( 0.7264, 0.3382) .. ( 0.6638, 0.3257) + -- ( 0.6638, 0.3767) + -- ( 0.5787, 0.3257) + --cycle + (-0.7817, 0.3257) + -- (-0.7137, 0.2407) + -- (-0.7988, 0.2746) + .. controls (-0.8162, 0.2534) and (-0.8404, 0.2432) .. (-0.8672, 0.2385) + -- (-0.8857, 0.2066) + -- (-0.6627, 0.2066) + .. controls (-0.5059, 0.2059) and (-0.2690, 0.1655) .. (-0.1185, 0.2066) + .. controls (-0.2358, 0.2532) and (-0.4834, 0.1773) .. (-0.5607, 0.2746) + -- (-0.6287, 0.2237) + -- (-0.6457, 0.2407) + .. controls (-0.5823, 0.3108) and (-0.5667, 0.3074) .. (-0.4756, 0.3087) + --cycle + ( 0.8338, 0.2576) + -- ( 0.7998, 0.2066) + -- ( 0.8906, 0.1990) + -- ( 0.8567, 0.2576) + --cycle + (-0.0164, 0.2237) + .. controls ( 0.0715, 0.1799) and ( 0.3189, 0.1896) .. ( 0.4257, 0.1896) + -- ( 0.4257, 0.2237) + --cycle + (-0.2716, 0.1216) + -- (-0.2716, 0.0876) + -- ( 0.1501, 0.0876) + -- ( 0.1434, 0.1042) + -- ( 0.0345, 0.1216) + --cycle + ( 0.1501, 0.0876) + -- ( 0.1536, 0.0789) + -- ( 0.1536, 0.0876) + --cycle + ( 0.1536, 0.0789) + -- ( 0.1536, 0.0196) + -- ( 0.0856, 0.0534) + -- ( 0.0686,-0.0145) + -- ( 0.7658,-0.0145) + .. controls ( 0.6332, 0.0380) and ( 0.4479,-0.0524) .. ( 0.3406, 0.0534) + -- ( 0.3236, 0.0534) + -- ( 0.2897, 0.0196) + -- ( 0.2897, 0.0876) + -- ( 0.2556, 0.0196) + -- ( 0.2386, 0.0876) + -- ( 0.1705, 0.0365) + --cycle + ( 0.3917, 0.1216) + -- ( 0.3917, 0.0876) + -- ( 0.8678, 0.0876) + .. controls ( 0.7768, 0.1266) and ( 0.5022, 0.1216) .. ( 0.3917, 0.1216) + --cycle + (-0.9351, 0.1208) + -- (-0.9518, 0.0921) + -- (-0.9518, 0.0876) + -- (-0.6117, 0.1045) + --cycle + (-0.9144, 0.0213) + .. controls (-0.9468, 0.0204) and (-0.9775, 0.0109) .. (-0.9996,-0.0116) + -- (-0.9982,-0.0141) + -- (-0.8158, 0.0026) + .. controls (-0.8449, 0.0142) and (-0.8804, 0.0222) .. (-0.9144, 0.0213) + --cycle + (-0.6287, 0.0196) + .. controls (-0.5470,-0.0404) and (-0.2796,-0.0145) .. (-0.1695,-0.0145) + -- (-0.1695, 0.0196) + --cycle + (-0.9488,-0.0996) + -- (-0.9292,-0.1335) + -- (-0.4756,-0.1335) + -- (-0.4756,-0.0996) + --cycle + (-0.2886,-0.0996) + -- (-0.2886,-0.1335) + -- ( 0.2726,-0.1335) + .. controls ( 0.2164,-0.0920) and ( 0.1871,-0.0997) .. ( 0.1195,-0.0996) + --cycle + ( 0.5478,-0.1025) + .. controls ( 0.5070,-0.1018) and ( 0.4651,-0.1086) .. ( 0.4257,-0.1165) + -- ( 0.6638,-0.1335) + .. controls ( 0.6286,-0.1113) and ( 0.5887,-0.1031) .. ( 0.5478,-0.1025) + --cycle + ( 0.8928,-0.1132) + .. controls ( 0.8481,-0.1114) and ( 0.8007,-0.1165) .. ( 0.7658,-0.1165) + -- ( 0.9264,-0.1394) + -- ( 0.9384,-0.1186) + .. controls ( 0.9238,-0.1157) and ( 0.9087,-0.1137) .. ( 0.8928,-0.1132) + --cycle + (-0.2982,-0.2002) + .. controls (-0.3469,-0.2010) and (-0.3950,-0.2053) .. (-0.4416,-0.2185) + -- (-0.0505,-0.2355) + -- ( 0.7827,-0.2355) + .. controls ( 0.6739,-0.1909) and ( 0.4335,-0.2017) .. ( 0.3067,-0.2016) + -- (-0.1525,-0.2016) + .. controls (-0.2005,-0.2016) and (-0.2496,-0.1992) .. (-0.2982,-0.2002) + --cycle + (-0.8328,-0.2016) + .. controls (-0.7894,-0.2498) and (-0.7244,-0.2355) .. (-0.6627,-0.2355) + -- (-0.6627,-0.3034) + -- (-0.6967,-0.2696) + -- (-0.7137,-0.2696) + .. controls (-0.7385,-0.3064) and (-0.7772,-0.3191) .. (-0.8200,-0.3227) + -- (-0.8113,-0.3377) + .. controls (-0.6682,-0.3440) and (-0.4684,-0.3376) .. (-0.3906,-0.3376) + -- (-0.4586,-0.2696) + -- (-0.5266,-0.3034) + -- (-0.5097,-0.2355) + -- (-0.5607,-0.3206) + -- (-0.5777,-0.2355) + -- (-0.6457,-0.3034) + -- (-0.6287,-0.2185) + --cycle + ( 0.8169,-0.2866) + -- ( 0.7489,-0.3206) + .. controls ( 0.7652,-0.3284) and ( 0.7871,-0.3345) .. ( 0.8114,-0.3386) + -- ( 0.8324,-0.3020) + --cycle + ( 0.2076,-0.3170) + .. controls ( 0.0913,-0.3168) and (-0.0288,-0.3206) .. (-0.0845,-0.3206) + -- ( 0.2509,-0.3621) + -- ( 0.2897,-0.4056) + -- ( 0.2556,-0.3716) + -- ( 0.2386,-0.3716) + -- ( 0.2386,-0.4566) + -- ( 0.4257,-0.4566) + -- ( 0.3746,-0.3716) + -- ( 0.3067,-0.4226) + -- ( 0.3067,-0.3547) + -- ( 0.4766,-0.3376) + .. controls ( 0.4363,-0.3215) and ( 0.3237,-0.3172) .. ( 0.2076,-0.3170) + --cycle + (-0.7622,-0.4226) + -- (-0.7427,-0.4566) + -- (-0.5607,-0.4566) + -- (-0.5607,-0.4226) + --cycle + (-0.3396,-0.4226) + -- (-0.3396,-0.4566) + -- (-0.0164,-0.4566) + -- (-0.0164,-0.4226) + --cycle + ( 0.5787,-0.4226) + .. controls ( 0.6179,-0.4661) and ( 0.6835,-0.4595) .. ( 0.7407,-0.4607) + -- ( 0.7528,-0.4400) + .. controls ( 0.6947,-0.4396) and ( 0.6370,-0.4368) .. ( 0.5787,-0.4226) + --cycle + (-0.2496,-0.5239) + .. controls (-0.2827,-0.5212) and (-0.3176,-0.5246) .. (-0.3566,-0.5246) + -- (-0.7034,-0.5246) + -- (-0.6873,-0.5524) + .. controls (-0.6429,-0.5639) and (-0.5972,-0.5587) .. (-0.5436,-0.5587) + -- (-0.1525,-0.5587) + .. controls (-0.1848,-0.5349) and (-0.2163,-0.5263) .. (-0.2496,-0.5239) + --cycle + (-0.0164,-0.5417) + .. controls ( 0.0514,-0.5917) and ( 0.1065,-0.5717) .. ( 0.1876,-0.5736) + .. controls ( 0.2932,-0.5761) and ( 0.5300,-0.5848) .. ( 0.6766,-0.5720) + -- ( 0.6872,-0.5538) + -- ( 0.4937,-0.5417) + --cycle + (-0.6255,-0.6593) + -- (-0.6248,-0.6607) + -- (-0.6117,-0.6607) + --cycle + (-0.5777,-0.6607) + -- (-0.5777,-0.7287) + -- (-0.5856,-0.7287) + -- (-0.5659,-0.7627) + -- (-0.3906,-0.7627) + -- (-0.1695,-0.7627) + -- (-0.4246,-0.7287) + -- (-0.4076,-0.6607) + -- (-0.4416,-0.7287) + -- (-0.4756,-0.7287) + -- (-0.4756,-0.6607) + -- (-0.5097,-0.6607) + -- (-0.5097,-0.7287) + --cycle + ( 0.0686,-0.7457) + .. controls ( 0.1464,-0.8028) and ( 0.3428,-0.7798) .. ( 0.4427,-0.7798) + -- ( 0.4427,-0.7457) + --cycle + (-0.3736,-0.8478) + -- (-0.3736,-0.8722) + -- (-0.2203,-0.8722) + .. controls (-0.2708,-0.8419) and (-0.3097,-0.8478) .. (-0.3736,-0.8478) + --cycle + (-0.0172,-0.8544) + .. controls (-0.0398,-0.8556) and (-0.0623,-0.8586) .. (-0.0845,-0.8648) + .. controls (-0.0753,-0.8684) and (-0.0664,-0.8700) .. (-0.0573,-0.8722) + -- ( 0.5033,-0.8722) + -- ( 0.5088,-0.8626) + .. controls ( 0.3892,-0.8602) and ( 0.2527,-0.8649) .. ( 0.1876,-0.8648) + .. controls ( 0.1186,-0.8647) and ( 0.0502,-0.8509) .. (-0.0172,-0.8544) + --cycle + ; + } +} +\fi +% \end{macrocode} +% \end{TikzKey} +% \iffalse +%</hex> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/hex/terrain/town.dtx b/macros/latex/contrib/wargame/source/hex/terrain/town.dtx new file mode 100644 index 0000000000..1186b54c81 --- /dev/null +++ b/macros/latex/contrib/wargame/source/hex/terrain/town.dtx @@ -0,0 +1,1061 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*hex> +% \fi +% \begin{TikzKey}{hex/terrain/town} +% A town. +% +% +% \begin{macrocode} +\ifhex@terrain@pic +\tikzset{ + hex/terrain/town/.pic={ + \path[hex/terrain/town/small road,pic actions,hex/terrain/town/post road] + ( 0.1432,-0.4518) + -- (-0.0320,-0.2906) + -- ( 0.0745,-0.0351) + -- ( 0.1130,-0.0387) + ; + \path[hex/terrain/town/small road,pic actions,hex/terrain/town/post road] + ( 0.0729,-0.0352) + -- (-0.1716, 0.0254) + ; + \path[hex/terrain/town/small road,pic actions,hex/terrain/town/post road] + (-0.2493, 0.5648) + -- (-0.2192, 0.4501) + ; + \path[hex/terrain/town/small road,pic actions,hex/terrain/town/post road] + ( 0.0677,-0.6538) + -- ( 0.1754,-0.7052) + -- ( 0.4358,-0.4688) + ; + \path[hex/terrain/town/small road,pic actions,hex/terrain/town/post road] + ( 0.0439,-0.3617) + -- (-0.0921,-0.5012) + -- (-0.2865,-0.3243) + -- (-0.4420,-0.4608) + -- (-0.5795,-0.4446) + -- (-0.6421,-0.3520) + ; + \path[hex/terrain/town/small road,pic actions,hex/terrain/town/post road] + ( 0.0622,-0.6515) + -- (-0.0316,-0.6176) + -- (-0.0221,-0.5364) + ; + \path[hex/terrain/town/small road,pic actions,hex/terrain/town/post road] + ( 0.0048,-0.2069) + -- (-0.1945,-0.1818) + -- (-0.2278,-0.2247) + -- (-0.5051,-0.1356) + ; + \path[hex/terrain/town/small road,pic actions,hex/terrain/town/post road] + (-0.3383, 0.0449) + -- (-0.2189, 0.4510) + ; + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + ( 0.0073, 0.8700) + -- ( 0.3952, 0.3373) + -- ( 0.3884, 0.2029) + -- ( 0.3555, 0.1378) + -- ( 0.3751, 0.0880) + -- ( 0.2513,-0.1997) + -- ( 0.1396,-0.4505) + -- ( 0.0641,-0.6512) + -- ( 0.0070,-0.8700) + -- ( 0.0070,-0.8700) + ; + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + ( 0.7575, 0.4367) + -- ( 0.3945, 0.3375) + -- ( 0.3945, 0.3375) + ; + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + (-0.1900,-0.0806) + -- (-0.0751, 0.3938) + -- (-0.0765, 0.3925) + ; + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + (-0.1308, 0.1580) + -- (-0.7603, 0.4394) + ; + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + (-0.7139,-0.1526) + -- (-0.6147,-0.3362) + -- (-0.7607,-0.4327) + ; + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + (-0.6676,-0.2405) + -- (-0.4599,-0.1067) + -- (-0.1877,-0.0679) + ; + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + ( 0.2082,-0.3003) + -- ( 0.4578,-0.4855) + -- ( 0.5914,-0.3675) + -- ( 0.7607,-0.4420) + ; + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + ( 0.3827, 0.1864) + -- (-0.1290, 0.1576) + ; + \path[hex/terrain/town/house,pic actions] + (-0.4493,-0.3075) + -- (-0.4043,-0.2868) + -- (-0.3710,-0.3593) + -- (-0.4160,-0.3799) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4493,-0.3075) + -- (-0.4043,-0.2868) + -- (-0.3710,-0.3593) + -- (-0.4160,-0.3799) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5264,-0.1066) + -- (-0.5514,-0.0681) + -- (-0.5002,-0.0349) + -- (-0.4753,-0.0733) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5264,-0.1066) + -- (-0.5514,-0.0681) + -- (-0.5002,-0.0349) + -- (-0.4753,-0.0733) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1978, 0.1663) + -- (-0.1534, 0.1549) + -- (-0.1685, 0.0960) + -- (-0.2130, 0.1074) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1978, 0.1663) + -- (-0.1534, 0.1549) + -- (-0.1685, 0.0960) + -- (-0.2130, 0.1074) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2259, 0.4898) + -- ( 0.2453, 0.4680) + -- ( 0.2052, 0.4324) + -- ( 0.1858, 0.4542) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2259, 0.4898) + -- ( 0.2453, 0.4680) + -- ( 0.2052, 0.4324) + -- ( 0.1858, 0.4542) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0986, 0.2553) + -- (-0.0882, 0.2827) + -- (-0.0380, 0.2637) + -- (-0.0484, 0.2363) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0986, 0.2553) + -- (-0.0882, 0.2827) + -- (-0.0380, 0.2637) + -- (-0.0484, 0.2363) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0834, 0.2379) + -- ( 0.0888, 0.2667) + -- ( 0.1415, 0.2566) + -- ( 0.1361, 0.2279) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0834, 0.2379) + -- ( 0.0888, 0.2667) + -- ( 0.1415, 0.2566) + -- ( 0.1361, 0.2279) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0207,-0.0604) + -- (-0.0103,-0.0331) + -- ( 0.0398,-0.0521) + -- ( 0.0294,-0.0794) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0207,-0.0604) + -- (-0.0103,-0.0331) + -- ( 0.0398,-0.0521) + -- ( 0.0294,-0.0794) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3580,-0.4608) + -- ( 0.3837,-0.4748) + -- ( 0.3581,-0.5219) + -- ( 0.3324,-0.5080) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3580,-0.4608) + -- ( 0.3837,-0.4748) + -- ( 0.3581,-0.5219) + -- ( 0.3324,-0.5080) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5127,-0.3559) + -- ( 0.5341,-0.3759) + -- ( 0.4975,-0.4151) + -- ( 0.4761,-0.3951) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5127,-0.3559) + -- ( 0.5341,-0.3759) + -- ( 0.4975,-0.4151) + -- ( 0.4761,-0.3951) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2118,-0.3884) + -- ( 0.2245,-0.3620) + -- ( 0.2728,-0.3854) + -- ( 0.2600,-0.4118) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2118,-0.3884) + -- ( 0.2245,-0.3620) + -- ( 0.2728,-0.3854) + -- ( 0.2600,-0.4118) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1651,-0.4740) + -- ( 0.1775,-0.4475) + -- ( 0.2260,-0.4702) + -- ( 0.2137,-0.4968) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1651,-0.4740) + -- ( 0.1775,-0.4475) + -- ( 0.2260,-0.4702) + -- ( 0.2137,-0.4968) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2834,-0.4196) + -- ( 0.2957,-0.3932) + -- ( 0.3443,-0.4159) + -- ( 0.3319,-0.4423) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2834,-0.4196) + -- ( 0.2957,-0.3932) + -- ( 0.3443,-0.4159) + -- ( 0.3319,-0.4423) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1447,-0.5170) + -- ( 0.1555,-0.4899) + -- ( 0.2053,-0.5096) + -- ( 0.1945,-0.5368) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1447,-0.5170) + -- ( 0.1555,-0.4899) + -- ( 0.2053,-0.5096) + -- ( 0.1945,-0.5368) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0154,-0.5671) + -- ( 0.0244,-0.5392) + -- ( 0.0754,-0.5558) + -- ( 0.0664,-0.5836) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0154,-0.5671) + -- ( 0.0244,-0.5392) + -- ( 0.0754,-0.5558) + -- ( 0.0664,-0.5836) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2958,-0.3614) + -- (-0.2707,-0.3764) + -- (-0.2983,-0.4224) + -- (-0.3234,-0.4073) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2958,-0.3614) + -- (-0.2707,-0.3764) + -- (-0.2983,-0.4224) + -- (-0.3234,-0.4073) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3024,-0.2385) + -- (-0.2753,-0.2491) + -- (-0.2948,-0.2990) + -- (-0.3220,-0.2883) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3024,-0.2385) + -- (-0.2753,-0.2491) + -- (-0.2948,-0.2990) + -- (-0.3220,-0.2883) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5719,-0.2295) + -- (-0.5577,-0.2550) + -- (-0.6045,-0.2811) + -- (-0.6187,-0.2556) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5719,-0.2295) + -- (-0.5577,-0.2550) + -- (-0.6045,-0.2811) + -- (-0.6187,-0.2556) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5909,-0.3922) + -- (-0.5677,-0.3744) + -- (-0.5351,-0.4170) + -- (-0.5584,-0.4348) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.5909,-0.3922) + -- (-0.5677,-0.3744) + -- (-0.5351,-0.4170) + -- (-0.5584,-0.4348) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4367,-0.3858) + -- (-0.4233,-0.4119) + -- (-0.4709,-0.4364) + -- (-0.4843,-0.4105) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.4367,-0.3858) + -- (-0.4233,-0.4119) + -- (-0.4709,-0.4364) + -- (-0.4843,-0.4105) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6605,-0.4272) + -- (-0.6489,-0.4540) + -- (-0.6982,-0.4752) + -- (-0.7097,-0.4483) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6605,-0.4272) + -- (-0.6489,-0.4540) + -- (-0.6982,-0.4752) + -- (-0.7097,-0.4483) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2694,-0.2379) + -- ( 0.2777,-0.2098) + -- ( 0.3291,-0.2250) + -- ( 0.3209,-0.2530) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2694,-0.2379) + -- ( 0.2777,-0.2098) + -- ( 0.3291,-0.2250) + -- ( 0.3209,-0.2530) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1131,-0.3134) + -- ( 0.1237,-0.2861) + -- ( 0.1737,-0.3055) + -- ( 0.1630,-0.3328) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1131,-0.3134) + -- ( 0.1237,-0.2861) + -- ( 0.1737,-0.3055) + -- ( 0.1630,-0.3328) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1931,-0.0936) + -- ( 0.2058,-0.0673) + -- ( 0.2541,-0.0904) + -- ( 0.2415,-0.1168) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1931,-0.0936) + -- ( 0.2058,-0.0673) + -- ( 0.2541,-0.0904) + -- ( 0.2415,-0.1168) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1779, 0.1198) + -- ( 0.1984, 0.0990) + -- ( 0.1603, 0.0613) + -- ( 0.1398, 0.0821) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1779, 0.1198) + -- ( 0.1984, 0.0990) + -- ( 0.1603, 0.0613) + -- ( 0.1398, 0.0821) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2761, 0.3992) + -- ( 0.2947, 0.3765) + -- ( 0.2533, 0.3425) + -- ( 0.2347, 0.3651) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2761, 0.3992) + -- ( 0.2947, 0.3765) + -- ( 0.2533, 0.3425) + -- ( 0.2347, 0.3651) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3227, 0.3548) + -- ( 0.3421, 0.3329) + -- ( 0.3020, 0.2974) + -- ( 0.2826, 0.3192) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3227, 0.3548) + -- ( 0.3421, 0.3329) + -- ( 0.3020, 0.2974) + -- ( 0.2826, 0.3192) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2473, 0.2770) + -- (-0.2380, 0.3048) + -- (-0.1871, 0.2879) + -- (-0.1964, 0.2601) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2473, 0.2770) + -- (-0.2380, 0.3048) + -- (-0.1871, 0.2879) + -- (-0.1964, 0.2601) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1395, 0.3602) + -- (-0.1127, 0.3488) + -- (-0.1335, 0.2995) + -- (-0.1604, 0.3109) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1395, 0.3602) + -- (-0.1127, 0.3488) + -- (-0.1335, 0.2995) + -- (-0.1604, 0.3109) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2901, 0.6234) + -- ( 0.3088, 0.6008) + -- ( 0.2674, 0.5667) + -- ( 0.2487, 0.5893) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2901, 0.6234) + -- ( 0.3088, 0.6008) + -- ( 0.2674, 0.5667) + -- ( 0.2487, 0.5893) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3456, 0.2854) + -- (-0.3335, 0.3120) + -- (-0.2847, 0.2898) + -- (-0.2968, 0.2632) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3456, 0.2854) + -- (-0.3335, 0.3120) + -- (-0.2847, 0.2898) + -- (-0.2968, 0.2632) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3040, 0.3746) + -- (-0.2919, 0.4012) + -- (-0.2431, 0.3791) + -- (-0.2552, 0.3524) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3040, 0.3746) + -- (-0.2919, 0.4012) + -- (-0.2431, 0.3791) + -- (-0.2552, 0.3524) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.7420,-0.2456) + -- (-0.7302,-0.2189) + -- (-0.6812,-0.2407) + -- (-0.6930,-0.2674) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.7420,-0.2456) + -- (-0.7302,-0.2189) + -- (-0.6812,-0.2407) + -- (-0.6930,-0.2674) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6678,-0.1369) + -- (-0.6492,-0.1143) + -- (-0.6078,-0.1484) + -- (-0.6264,-0.1710) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6678,-0.1369) + -- (-0.6492,-0.1143) + -- (-0.6078,-0.1484) + -- (-0.6264,-0.1710) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2252,-0.0023) + -- (-0.1960,-0.0023) + -- (-0.1960,-0.0559) + -- (-0.2252,-0.0559) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2252,-0.0023) + -- (-0.1960,-0.0023) + -- (-0.1960,-0.0559) + -- (-0.2252,-0.0559) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0041,-0.2944) + -- ( 0.0064,-0.2671) + -- ( 0.0564,-0.2862) + -- ( 0.0460,-0.3135) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0041,-0.2944) + -- ( 0.0064,-0.2671) + -- ( 0.0564,-0.2862) + -- ( 0.0460,-0.3135) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1877,-0.2296) + -- (-0.1764,-0.2026) + -- (-0.1270,-0.2233) + -- (-0.1383,-0.2503) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1877,-0.2296) + -- (-0.1764,-0.2026) + -- (-0.1270,-0.2233) + -- (-0.1383,-0.2503) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1170,-0.3014) + -- (-0.1067,-0.2740) + -- (-0.0566,-0.2928) + -- (-0.0668,-0.3202) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1170,-0.3014) + -- (-0.1067,-0.2740) + -- (-0.0566,-0.2928) + -- (-0.0668,-0.3202) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0719,-0.3499) + -- (-0.0428,-0.3468) + -- (-0.0371,-0.4001) + -- (-0.0661,-0.4032) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0719,-0.3499) + -- (-0.0428,-0.3468) + -- (-0.0371,-0.4001) + -- (-0.0661,-0.4032) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4610, 0.0967) + -- ( 0.4896, 0.0909) + -- ( 0.4790, 0.0384) + -- ( 0.4503, 0.0442) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4610, 0.0967) + -- ( 0.4896, 0.0909) + -- ( 0.4790, 0.0384) + -- ( 0.4503, 0.0442) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1944,-0.4810) + -- (-0.1500,-0.4925) + -- (-0.1653,-0.5515) + -- (-0.2097,-0.5399) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1944,-0.4810) + -- (-0.1500,-0.4925) + -- (-0.1653,-0.5515) + -- (-0.2097,-0.5399) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2924,-0.1375) + -- ( 0.3110,-0.0955) + -- ( 0.3667,-0.1202) + -- ( 0.3481,-0.1621) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2924,-0.1375) + -- ( 0.3110,-0.0955) + -- ( 0.3667,-0.1202) + -- ( 0.3481,-0.1621) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3062, 0.5810) + -- (-0.2635, 0.5641) + -- (-0.2859, 0.5075) + -- (-0.3285, 0.5243) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3062, 0.5810) + -- (-0.2635, 0.5641) + -- (-0.2859, 0.5075) + -- (-0.3285, 0.5243) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0310,-0.4661) + -- ( 0.0449,-0.4224) + -- ( 0.1029,-0.4409) + -- ( 0.0889,-0.4846) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0310,-0.4661) + -- ( 0.0449,-0.4224) + -- ( 0.1029,-0.4409) + -- ( 0.0889,-0.4846) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1523,-0.2013) + -- ( 0.1718,-0.1598) + -- ( 0.2270,-0.1857) + -- ( 0.2075,-0.2272) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1523,-0.2013) + -- ( 0.1718,-0.1598) + -- ( 0.2270,-0.1857) + -- ( 0.2075,-0.2272) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0857,-0.3676) + -- ( 0.1052,-0.3261) + -- ( 0.1603,-0.3520) + -- ( 0.1409,-0.3935) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0857,-0.3676) + -- ( 0.1052,-0.3261) + -- ( 0.1603,-0.3520) + -- ( 0.1409,-0.3935) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0204,-0.2046) + -- ( 0.0398,-0.1631) + -- ( 0.0950,-0.1890) + -- ( 0.0755,-0.2305) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0204,-0.2046) + -- ( 0.0398,-0.1631) + -- ( 0.0950,-0.1890) + -- ( 0.0755,-0.2305) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5094, 0.3292) + -- ( 0.5505, 0.3494) + -- ( 0.5773, 0.2947) + -- ( 0.5362, 0.2746) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5094, 0.3292) + -- ( 0.5505, 0.3494) + -- ( 0.5773, 0.2947) + -- ( 0.5362, 0.2746) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0647, 0.4710) + -- (-0.0215, 0.4559) + -- (-0.0416, 0.3984) + -- (-0.0848, 0.4135) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0647, 0.4710) + -- (-0.0215, 0.4559) + -- (-0.0416, 0.3984) + -- (-0.0848, 0.4135) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1476,-0.3704) + -- (-0.1403,-0.3251) + -- (-0.0802,-0.3347) + -- (-0.0873,-0.3799) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1476,-0.3704) + -- (-0.1403,-0.3251) + -- (-0.0802,-0.3347) + -- (-0.0873,-0.3799) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0755, 0.3210) + -- (-0.0531, 0.3610) + -- ( 0.0001, 0.3312) + -- (-0.0224, 0.2912) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0755, 0.3210) + -- (-0.0531, 0.3610) + -- ( 0.0001, 0.3312) + -- (-0.0224, 0.2912) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1354, 0.0442) + -- (-0.1129, 0.0842) + -- (-0.0599, 0.0544) + -- (-0.0823, 0.0144) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1354, 0.0442) + -- (-0.1129, 0.0842) + -- (-0.0599, 0.0544) + -- (-0.0823, 0.0144) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1672,-0.0608) + -- (-0.1524,-0.0175) + -- (-0.0948,-0.0371) + -- (-0.1096,-0.0805) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1672,-0.0608) + -- (-0.1524,-0.0175) + -- (-0.0948,-0.0371) + -- (-0.1096,-0.0805) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0920,-0.6296) + -- ( 0.1069,-0.5863) + -- ( 0.1645,-0.6060) + -- ( 0.1497,-0.6493) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0920,-0.6296) + -- ( 0.1069,-0.5863) + -- ( 0.1645,-0.6060) + -- ( 0.1497,-0.6493) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4115,-0.5373) + -- ( 0.4390,-0.5006) + -- ( 0.4877,-0.5372) + -- ( 0.4601,-0.5739) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4115,-0.5373) + -- ( 0.4390,-0.5006) + -- ( 0.4877,-0.5372) + -- ( 0.4601,-0.5739) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3095, 0.1272) + -- ( 0.3519, 0.1095) + -- ( 0.3284, 0.0533) + -- ( 0.2861, 0.0710) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3095, 0.1272) + -- ( 0.3519, 0.1095) + -- ( 0.3284, 0.0533) + -- ( 0.2861, 0.0710) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3558, 0.0291) + -- (-0.3124, 0.0144) + -- (-0.3318,-0.0433) + -- (-0.3753,-0.0287) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3558, 0.0291) + -- (-0.3124, 0.0144) + -- (-0.3318,-0.0433) + -- (-0.3753,-0.0287) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2904, 0.2714) + -- ( 0.3361, 0.2681) + -- ( 0.3318, 0.2074) + -- ( 0.2861, 0.2106) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2904, 0.2714) + -- ( 0.3361, 0.2681) + -- ( 0.3318, 0.2074) + -- ( 0.2861, 0.2106) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0124, 0.1558) + -- ( 0.0333, 0.1525) + -- ( 0.0290, 0.0918) + -- (-0.0167, 0.0950) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0124, 0.1558) + -- ( 0.0333, 0.1525) + -- ( 0.0290, 0.0918) + -- (-0.0167, 0.0950) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4665, 0.4396) + -- ( 0.4868, 0.3985) + -- ( 0.4321, 0.3716) + -- ( 0.4119, 0.4127) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4665, 0.4396) + -- ( 0.4868, 0.3985) + -- ( 0.4321, 0.3716) + -- ( 0.4119, 0.4127) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2433,-0.1480) + -- (-0.2141,-0.1472) + -- (-0.2127,-0.2008) + -- (-0.2419,-0.2015) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2433,-0.1480) + -- (-0.2141,-0.1472) + -- (-0.2127,-0.2008) + -- (-0.2419,-0.2015) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4187, 0.2523) + -- ( 0.4643, 0.2574) + -- ( 0.4711, 0.1969) + -- ( 0.4256, 0.1917) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4187, 0.2523) + -- ( 0.4643, 0.2574) + -- ( 0.4711, 0.1969) + -- ( 0.4256, 0.1917) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2599,-0.2379) + -- (-0.2164,-0.2525) + -- (-0.2358,-0.3102) + -- (-0.2793,-0.2955) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2599,-0.2379) + -- (-0.2164,-0.2525) + -- (-0.2358,-0.3102) + -- (-0.2793,-0.2955) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0167, 0.0438) + -- ( 0.0385, 0.0365) + -- ( 0.0301, 0.0113) + -- ( 0.0082, 0.0187) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.0167, 0.0438) + -- ( 0.0385, 0.0365) + -- ( 0.0301, 0.0113) + -- ( 0.0082, 0.0187) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2901,-0.1193) + -- (-0.2450,-0.1273) + -- (-0.2556,-0.1872) + -- (-0.3008,-0.1792) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.2901,-0.1193) + -- (-0.2450,-0.1273) + -- (-0.2556,-0.1872) + -- (-0.3008,-0.1792) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1275,-0.0001) + -- ( 0.1734,-0.0022) + -- ( 0.1707,-0.0630) + -- ( 0.1248,-0.0610) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.1275,-0.0001) + -- ( 0.1734,-0.0022) + -- ( 0.1707,-0.0630) + -- ( 0.1248,-0.0610) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0645,-0.5272) + -- (-0.0415,-0.5245) + -- (-0.0383,-0.5509) + -- (-0.0612,-0.5536) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.0645,-0.5272) + -- (-0.0415,-0.5245) + -- (-0.0383,-0.5509) + -- (-0.0612,-0.5536) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3209, 0.2176) + -- (-0.2989, 0.2105) + -- (-0.3069, 0.1853) + -- (-0.3289, 0.1923) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3209, 0.2176) + -- (-0.2989, 0.2105) + -- (-0.3069, 0.1853) + -- (-0.3289, 0.1923) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3746, 0.1600) + -- ( 0.4021, 0.1699) + -- ( 0.4204, 0.1195) + -- ( 0.3929, 0.1095) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3746, 0.1600) + -- ( 0.4021, 0.1699) + -- ( 0.4204, 0.1195) + -- ( 0.3929, 0.1095) + --cycle + ; + } +} +\fi +% \end{macrocode} +% \end{TikzKey} +% \iffalse +%</hex> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/hex/terrain/tree.dtx b/macros/latex/contrib/wargame/source/hex/terrain/tree.dtx new file mode 100644 index 0000000000..93c2987227 --- /dev/null +++ b/macros/latex/contrib/wargame/source/hex/terrain/tree.dtx @@ -0,0 +1,31 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*hex> +% \fi +% \begin{TikzKey}{hex/terrain/tree} +% \begin{macrocode} +\tikzset{ + hex/terrain/tree/.pic={ + \path[draw,very thick,pic actions] + (-.15,.0) + arc (269:135:.1) + arc (215: 90:.1) + arc (180: 45:.1) + arc (135: 0:.1) + arc ( 90:-45:.1) + arc ( 45:-90:.1) + (-.15,.025) + arc (60:-60:.25) + arc (150:30:.075) + arc (150:30:.075) + arc (150:30:.075) + arc (-120:-240:.25); + + } +} +% \end{macrocode} +% \end{TikzKey} +% \iffalse +%</hex> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/hex/terrain/village.dtx b/macros/latex/contrib/wargame/source/hex/terrain/village.dtx new file mode 100644 index 0000000000..837b92642c --- /dev/null +++ b/macros/latex/contrib/wargame/source/hex/terrain/village.dtx @@ -0,0 +1,352 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*hex> +% \fi +% \begin{TikzKey}{hex/terrain/town/road, +% hex/terrain/town/small road, +% hex/terrain/town/house} +% For villages, towns, and cities, we need three styles: one for +% houses, and separate styles for regular and small roads. Note +% that we draw using the stroke colour for roads and houses. +% +% \begin{macrocode} +\ifhex@terrain@pic +\tikzset{ + hex/terrain/town/road/.style={ + fill=none, + draw=gray!50!black, + scale line widths, + line width=.3mm + }, + hex/terrain/town/small road/.style={ + fill=none, + draw=gray!75!black, + scale line widths, + line width=.15mm + }, + hex/terrain/town/post road/.style={ + fill=none + }, + hex/terrain/town/house/.style={ + draw=none, + fill=gray!75!black, + } +} +% \end{macrocode} +% \end{TikzKey} +% +% +% \begin{TikzKey}{hex/terrain/village} +% Now for village, town, and city patterns. +% +% +% \begin{macrocode} +\tikzset{ + hex/terrain/village/.pic={ + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + ( 0.0073, 0.8700) + -- ( 0.3952, 0.3373) + -- ( 0.3884, 0.2029) + -- ( 0.3555, 0.1378) + -- ( 0.3751, 0.0880) + -- ( 0.2513,-0.1997) + -- ( 0.1396,-0.4505) + -- ( 0.0641,-0.6512) + -- ( 0.0070,-0.8700) + -- ( 0.0070,-0.8700) + ; + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + ( 0.7575, 0.4367) + -- ( 0.3945, 0.3375) + -- ( 0.3945, 0.3375) + ; + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + (-0.1900,-0.0806) + -- (-0.1155, 0.1588) + ; + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + (-0.1308, 0.1580) + -- (-0.7603, 0.4394) + ; + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + (-0.6615,-0.2309) + -- (-0.6777,-0.3255) + -- (-0.7607,-0.4327) + ; + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + (-0.6676,-0.2405) + -- (-0.4599,-0.1067) + -- (-0.1877,-0.0679) + ; + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + ( 0.2082,-0.3003) + -- ( 0.4578,-0.4855) + -- ( 0.5914,-0.3675) + -- ( 0.7607,-0.4420) + ; + \path[hex/terrain/town/road,pic actions,hex/terrain/town/post road] + ( 0.3827, 0.1864) + -- (-0.1290, 0.1576) + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2259, 0.4898) + -- ( 0.2453, 0.4680) + -- ( 0.2052, 0.4324) + -- ( 0.1858, 0.4542) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2259, 0.4898) + -- ( 0.2453, 0.4680) + -- ( 0.2052, 0.4324) + -- ( 0.1858, 0.4542) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1978, 0.1663) + -- (-0.1534, 0.1549) + -- (-0.1685, 0.0960) + -- (-0.2130, 0.1074) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1978, 0.1663) + -- (-0.1534, 0.1549) + -- (-0.1685, 0.0960) + -- (-0.2130, 0.1074) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5127,-0.3559) + -- ( 0.5341,-0.3759) + -- ( 0.4975,-0.4151) + -- ( 0.4761,-0.3951) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5127,-0.3559) + -- ( 0.5341,-0.3759) + -- ( 0.4975,-0.4151) + -- ( 0.4761,-0.3951) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2761, 0.3992) + -- ( 0.2947, 0.3765) + -- ( 0.2533, 0.3425) + -- ( 0.2347, 0.3651) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2761, 0.3992) + -- ( 0.2947, 0.3765) + -- ( 0.2533, 0.3425) + -- ( 0.2347, 0.3651) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3227, 0.3548) + -- ( 0.3421, 0.3329) + -- ( 0.3020, 0.2974) + -- ( 0.2826, 0.3192) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3227, 0.3548) + -- ( 0.3421, 0.3329) + -- ( 0.3020, 0.2974) + -- ( 0.2826, 0.3192) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2901, 0.6234) + -- ( 0.3088, 0.6008) + -- ( 0.2674, 0.5667) + -- ( 0.2487, 0.5893) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2901, 0.6234) + -- ( 0.3088, 0.6008) + -- ( 0.2674, 0.5667) + -- ( 0.2487, 0.5893) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3456, 0.2854) + -- (-0.3335, 0.3120) + -- (-0.2847, 0.2898) + -- (-0.2968, 0.2632) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.3456, 0.2854) + -- (-0.3335, 0.3120) + -- (-0.2847, 0.2898) + -- (-0.2968, 0.2632) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6678,-0.1369) + -- (-0.6492,-0.1143) + -- (-0.6078,-0.1484) + -- (-0.6264,-0.1710) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.6678,-0.1369) + -- (-0.6492,-0.1143) + -- (-0.6078,-0.1484) + -- (-0.6264,-0.1710) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4610, 0.0967) + -- ( 0.4896, 0.0909) + -- ( 0.4790, 0.0384) + -- ( 0.4503, 0.0442) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4610, 0.0967) + -- ( 0.4896, 0.0909) + -- ( 0.4790, 0.0384) + -- ( 0.4503, 0.0442) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2924,-0.1375) + -- ( 0.3110,-0.0955) + -- ( 0.3667,-0.1202) + -- ( 0.3481,-0.1621) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2924,-0.1375) + -- ( 0.3110,-0.0955) + -- ( 0.3667,-0.1202) + -- ( 0.3481,-0.1621) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5094, 0.3292) + -- ( 0.5505, 0.3494) + -- ( 0.5773, 0.2947) + -- ( 0.5362, 0.2746) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.5094, 0.3292) + -- ( 0.5505, 0.3494) + -- ( 0.5773, 0.2947) + -- ( 0.5362, 0.2746) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1323, 0.2640) + -- (-0.0890, 0.2489) + -- (-0.1092, 0.1914) + -- (-0.1524, 0.2065) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + (-0.1323, 0.2640) + -- (-0.0890, 0.2489) + -- (-0.1092, 0.1914) + -- (-0.1524, 0.2065) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4115,-0.5373) + -- ( 0.4390,-0.5006) + -- ( 0.4877,-0.5372) + -- ( 0.4601,-0.5739) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4115,-0.5373) + -- ( 0.4390,-0.5006) + -- ( 0.4877,-0.5372) + -- ( 0.4601,-0.5739) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3095, 0.1272) + -- ( 0.3519, 0.1095) + -- ( 0.3284, 0.0533) + -- ( 0.2861, 0.0710) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3095, 0.1272) + -- ( 0.3519, 0.1095) + -- ( 0.3284, 0.0533) + -- ( 0.2861, 0.0710) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2904, 0.2714) + -- ( 0.3361, 0.2681) + -- ( 0.3318, 0.2074) + -- ( 0.2861, 0.2106) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.2904, 0.2714) + -- ( 0.3361, 0.2681) + -- ( 0.3318, 0.2074) + -- ( 0.2861, 0.2106) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4665, 0.4396) + -- ( 0.4868, 0.3985) + -- ( 0.4321, 0.3716) + -- ( 0.4119, 0.4127) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4665, 0.4396) + -- ( 0.4868, 0.3985) + -- ( 0.4321, 0.3716) + -- ( 0.4119, 0.4127) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4187, 0.2523) + -- ( 0.4643, 0.2574) + -- ( 0.4711, 0.1969) + -- ( 0.4256, 0.1917) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.4187, 0.2523) + -- ( 0.4643, 0.2574) + -- ( 0.4711, 0.1969) + -- ( 0.4256, 0.1917) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3746, 0.1600) + -- ( 0.4021, 0.1699) + -- ( 0.4204, 0.1195) + -- ( 0.3929, 0.1095) + --cycle + ; + \path[hex/terrain/town/house,pic actions] + ( 0.3746, 0.1600) + -- ( 0.4021, 0.1699) + -- ( 0.4204, 0.1195) + -- ( 0.3929, 0.1095) + --cycle + ; + } +} +\fi +% \end{macrocode} +% \end{TikzKey} +% +% \iffalse +%</hex> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/hex/terrain/woods.dtx b/macros/latex/contrib/wargame/source/hex/terrain/woods.dtx new file mode 100644 index 0000000000..9b0d08499b --- /dev/null +++ b/macros/latex/contrib/wargame/source/hex/terrain/woods.dtx @@ -0,0 +1,1011 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*hex> +% \fi +% \begin{TikzKey}{hex/terrain/woods} +% The style for woods. The pattern is filled with a darker green, +% and outlines are not drawn. +% +% \begin{macrocode} +\tikzset{ + hex/terrain/woods/.style={ + draw=none, + fill={rgb,100:red,27;green,67;blue,27} + } +} +% \end{macrocode} +% \end{TikzKey} +% +% \begin{TikzKey}{hex/terrain/woods} +% Regular woods. +% +% \begin{macrocode} +\ifhex@terrain@pic +\tikzset{ + hex/terrain/woods/.pic={ + \path[hex/terrain/woods,pic actions,draw=none] + (-0.2656, 0.8694) + .. controls (-0.3133, 0.8640) and (-0.3608, 0.8400) .. (-0.3541, 0.8219) + .. controls (-0.3417, 0.7629) and (-0.2512, 0.7779) .. (-0.2082, 0.7875) + -- (-0.2424, 0.6937) + .. controls (-0.2916, 0.7000) and (-0.3535, 0.6915) .. (-0.3950, 0.6606) + .. controls (-0.4299, 0.6330) and (-0.4373, 0.5909) .. (-0.3950, 0.5657) + .. controls (-0.4092, 0.5022) and (-0.3694, 0.4908) .. (-0.3191, 0.4633) + .. controls (-0.3291, 0.3852) and (-0.2535, 0.3866) .. (-0.2935, 0.4633) + .. controls (-0.2488, 0.4801) and (-0.2488, 0.5071) .. (-0.2778, 0.5156) + .. controls (-0.2888, 0.5201) and (-0.3300, 0.5153) .. (-0.3447, 0.5156) + -- (-0.3191, 0.6255) + -- (-0.2680, 0.6425) + -- (-0.2253, 0.5657) + .. controls (-0.2136, 0.5780) and (-0.2023, 0.5853) .. (-0.2092, 0.6046) + .. controls (-0.2132, 0.6161) and (-0.2403, 0.6366) .. (-0.2260, 0.6502) + .. controls (-0.2044, 0.6711) and (-0.1779, 0.6203) .. (-0.1564, 0.6147) + .. controls (-0.1363, 0.6094) and (-0.1262, 0.6240) .. (-0.1328, 0.6430) + .. controls (-0.1449, 0.6778) and (-0.1661, 0.6737) .. (-0.1741, 0.7278) + .. controls (-0.1213, 0.6943) and (-0.1063, 0.7287) .. (-0.1485, 0.7534) + -- (-0.1058, 0.7875) + -- (-0.0718, 0.7789) + -- (-0.0633, 0.8046) + .. controls (-0.0937, 0.8085) and (-0.0917, 0.8079) .. (-0.1143, 0.7875) + -- (-0.1311, 0.8194) + .. controls (-0.0764, 0.8223) and (-0.0450, 0.8485) .. (-0.0671, 0.8554) + .. controls (-0.1156, 0.8701) and (-0.1015, 0.8233) .. (-0.1806, 0.8398) + .. controls (-0.1900, 0.8580) and (-0.2089, 0.8664) .. (-0.2307, 0.8694) + --cycle + ( 0.3814, 0.8694) + .. controls ( 0.3767, 0.8683) and ( 0.3712, 0.8666) .. ( 0.3632, 0.8643) + -- ( 0.3974, 0.8387) + .. controls ( 0.3974, 0.8591) and ( 0.3972, 0.8674) .. ( 0.3911, 0.8694) + --cycle + (-0.2452, 0.8541) + .. controls (-0.2324, 0.8571) and (-0.2266, 0.8501) .. (-0.2079, 0.8422) + -- (-0.2167, 0.8284) + .. controls (-0.2397, 0.8309) and (-0.2848, 0.8202) .. (-0.2983, 0.8284) + .. controls (-0.3215, 0.8378) and (-0.2860, 0.8342) .. (-0.2614, 0.8473) + .. controls (-0.2547, 0.8509) and (-0.2496, 0.8531) .. (-0.2452, 0.8541) + --cycle + (-0.4331, 0.8427) + .. controls (-0.4534, 0.8538) and (-0.5066, 0.7937) .. (-0.5170, 0.7773) + .. controls (-0.5802, 0.6871) and (-0.6279, 0.5503) .. (-0.6704, 0.5650) + .. controls (-0.6703, 0.5117) and (-0.7322, 0.4917) .. (-0.7340, 0.4547) + .. controls (-0.7365, 0.4053) and (-0.6948, 0.3832) .. (-0.6621, 0.3593) + .. controls (-0.6271, 0.3335) and (-0.6254, 0.2860) .. (-0.5409, 0.3014) + -- (-0.5409, 0.3184) + -- (-0.5750, 0.3099) + -- (-0.5836, 0.3524) + -- (-0.4898, 0.3184) + -- (-0.5068, 0.3696) + .. controls (-0.4593, 0.3586) and (-0.4552, 0.3659) .. (-0.4214, 0.3269) + .. controls (-0.3754, 0.3528) and (-0.3794, 0.4022) .. (-0.4295, 0.4177) + .. controls (-0.4450, 0.4224) and (-0.4931, 0.4354) .. (-0.5068, 0.4333) + .. controls (-0.5383, 0.4284) and (-0.6200, 0.3557) .. (-0.6774, 0.4548) + -- (-0.6432, 0.4548) + -- (-0.6603, 0.4975) + .. controls (-0.6019, 0.4851) and (-0.6021, 0.5053) .. (-0.5921, 0.5572) + .. controls (-0.4969, 0.5307) and (-0.5431, 0.5224) .. (-0.4812, 0.4890) + .. controls (-0.4749, 0.5293) and (-0.4896, 0.5637) .. (-0.5068, 0.5998) + .. controls (-0.4948, 0.6064) and (-0.4850, 0.6107) .. (-0.4746, 0.6204) + .. controls (-0.4177, 0.6740) and (-0.4877, 0.7151) .. (-0.5154, 0.6423) + .. controls (-0.5225, 0.6240) and (-0.5189, 0.6174) .. (-0.5154, 0.5998) + -- (-0.5889, 0.6190) + .. controls (-0.5889, 0.6190) and (-0.5470, 0.6607) .. (-0.5396, 0.6879) + .. controls (-0.5254, 0.7392) and (-0.4740, 0.7624) .. (-0.4378, 0.7960) + .. controls (-0.4256, 0.8071) and (-0.3322, 0.7872) .. (-0.4331, 0.8427) + --cycle + ( 0.1374, 0.8418) + .. controls ( 0.1320, 0.8428) and ( 0.1261, 0.8424) .. ( 0.1202, 0.8403) + .. controls ( 0.1031, 0.8066) and ( 0.1641, 0.7460) .. ( 0.1812, 0.7545) + .. controls ( 0.1999, 0.7639) and ( 0.1758, 0.8354) .. ( 0.1374, 0.8418) + --cycle + (-0.0462, 0.8217) + -- (-0.0462, 0.7789) + -- (-0.0121, 0.7961) + --cycle + ( 0.3717, 0.8217) + -- ( 0.3717, 0.8046) + -- ( 0.4059, 0.7961) + -- ( 0.4144, 0.8217) + --cycle + ( 0.4898, 0.8122) + .. controls ( 0.4741, 0.8124) and ( 0.4748, 0.7893) .. ( 0.4981, 0.7754) + .. controls ( 0.5017, 0.7550) and ( 0.5313, 0.6452) .. ( 0.5686, 0.6689) + .. controls ( 0.5928, 0.6844) and ( 0.5339, 0.7103) .. ( 0.5653, 0.7412) + .. controls ( 0.5710, 0.7471) and ( 0.5728, 0.7507) .. ( 0.5731, 0.7536) + -- ( 0.5703, 0.7583) + .. controls ( 0.5582, 0.7647) and ( 0.5121, 0.7531) .. ( 0.5343, 0.7796) + .. controls ( 0.5145, 0.8036) and ( 0.4992, 0.8122) .. ( 0.4898, 0.8122) + --cycle + ( 0.3291, 0.7997) + .. controls ( 0.3112, 0.7975) and ( 0.2934, 0.7843) .. ( 0.2780, 0.7757) + .. controls ( 0.2235, 0.7455) and ( 0.1913, 0.7199) .. ( 0.2438, 0.6595) + .. controls ( 0.2287, 0.6542) and ( 0.2176, 0.6521) .. ( 0.2063, 0.6389) + .. controls ( 0.1704, 0.5968) and ( 0.2192, 0.5413) .. ( 0.2430, 0.5712) + .. controls ( 0.2494, 0.5791) and ( 0.2509, 0.6061) .. ( 0.2523, 0.6170) + .. controls ( 0.2545, 0.6376) and ( 0.2547, 0.6388) .. ( 0.2523, 0.6595) + -- ( 0.2865, 0.6681) + .. controls ( 0.3094, 0.6426) and ( 0.3194, 0.6608) .. ( 0.3291, 0.6852) + -- ( 0.2865, 0.6937) + .. controls ( 0.3061, 0.7101) and ( 0.3276, 0.7308) .. ( 0.3547, 0.7322) + .. controls ( 0.3792, 0.7335) and ( 0.4787, 0.6707) .. ( 0.4596, 0.7446) + .. controls ( 0.4487, 0.7866) and ( 0.4132, 0.7751) .. ( 0.3912, 0.7800) + .. controls ( 0.3681, 0.7853) and ( 0.3549, 0.8026) .. ( 0.3291, 0.7997) + --cycle + ( 0.0971, 0.7996) + .. controls ( 0.0971, 0.7996) and (-0.0371, 0.7713) .. (-0.0393, 0.7247) + .. controls (-0.0408, 0.6927) and ( 0.0217, 0.7175) .. ( 0.0521, 0.7277) + .. controls ( 0.0789, 0.7366) and ( 0.0971, 0.7996) .. ( 0.0971, 0.7996) + --cycle + (-0.1571, 0.7961) + -- (-0.1485, 0.7961) + -- (-0.1485, 0.7875) + -- (-0.1400, 0.7875) + -- (-0.1400, 0.7789) + -- (-0.1485, 0.7875) + --cycle + (-0.3689, 0.7733) + .. controls (-0.3791, 0.7835) and (-0.4247, 0.7612) .. (-0.4247, 0.7612) + .. controls (-0.4247, 0.7612) and (-0.4258, 0.7138) .. (-0.4104, 0.7184) + .. controls (-0.3965, 0.7227) and (-0.3586, 0.7631) .. (-0.3689, 0.7733) + --cycle + ( 0.3462, 0.7278) + -- ( 0.3462, 0.6766) + -- ( 0.3804, 0.7107) + --cycle + ( 0.1142, 0.7077) + .. controls ( 0.1016, 0.7065) and ( 0.0878, 0.7029) .. ( 0.0733, 0.6974) + .. controls ( 0.0595, 0.6920) and ( 0.0449, 0.6883) .. ( 0.0332, 0.6789) + .. controls ( 0.0192, 0.6678) and ( 0.0113, 0.6500) .. ( 0.0014, 0.6354) + .. controls (-0.0079, 0.6219) and (-0.0221, 0.6074) .. (-0.0243, 0.5905) + .. controls (-0.0267, 0.5713) and ( 0.0128, 0.4923) .. ( 0.0326, 0.4877) + .. controls ( 0.0455, 0.4824) and ( 0.0530, 0.4866) .. ( 0.0647, 0.4877) + .. controls ( 0.0870, 0.4591) and ( 0.0975, 0.4638) .. ( 0.1331, 0.4633) + .. controls ( 0.1499, 0.4110) and ( 0.1908, 0.4198) .. ( 0.1671, 0.4890) + .. controls ( 0.1267, 0.5142) and ( 0.1094, 0.5105) .. ( 0.0647, 0.4975) + .. controls ( 0.0889, 0.5509) and ( 0.0981, 0.5486) .. ( 0.0733, 0.6084) + .. controls ( 0.1221, 0.6144) and ( 0.1333, 0.6047) .. ( 0.1415, 0.6510) + -- ( 0.1927, 0.6425) + .. controls ( 0.1814, 0.6932) and ( 0.1526, 0.7111) .. ( 0.1142, 0.7077) + --cycle + ( 0.1671, 0.4890) + -- ( 0.2182, 0.4890) + .. controls ( 0.2474, 0.4580) and ( 0.2982, 0.5061) .. ( 0.2981, 0.5238) + .. controls ( 0.2981, 0.5425) and ( 0.2721, 0.5720) .. ( 0.2418, 0.5318) + -- ( 0.2182, 0.4975) + .. controls ( 0.1923, 0.5152) and ( 0.1850, 0.5158) .. ( 0.1671, 0.4890) + --cycle + (-0.1058, 0.6937) + -- (-0.0973, 0.6595) + -- (-0.0802, 0.6595) + -- (-0.0718, 0.6937) + --cycle + ( 0.3889, 0.6852) + .. controls ( 0.3954, 0.6469) and ( 0.4108, 0.6416) .. ( 0.4314, 0.6766) + --cycle + ( 0.4826, 0.6852) + -- ( 0.4562, 0.6475) + .. controls ( 0.4460, 0.6335) and ( 0.4249, 0.5852) .. ( 0.4639, 0.5976) + .. controls ( 0.4953, 0.6076) and ( 0.5058, 0.6583) .. ( 0.4998, 0.6852) + --cycle + (-0.0879, 0.6326) + .. controls (-0.1189, 0.6139) and (-0.0956, 0.5976) .. (-0.0822, 0.6003) + .. controls (-0.0699, 0.6027) and (-0.0544, 0.6253) .. (-0.0879, 0.6326) + --cycle + ( 0.3034, 0.6255) + -- ( 0.2694, 0.6170) + -- ( 0.2694, 0.5998) + -- ( 0.3034, 0.5913) + --cycle + ( 0.6085, 0.6015) + .. controls ( 0.5969, 0.6043) and ( 0.5796, 0.6004) .. ( 0.5688, 0.5964) + .. controls ( 0.5189, 0.5780) and ( 0.5216, 0.5317) .. ( 0.5338, 0.4890) + .. controls ( 0.5892, 0.5200) and ( 0.5513, 0.5451) .. ( 0.6191, 0.5657) + .. controls ( 0.6318, 0.5296) and ( 0.6176, 0.4979) .. ( 0.6703, 0.5572) + .. controls ( 0.6580, 0.5662) and ( 0.6196, 0.5989) .. ( 0.6085, 0.6015) + --cycle + ( 0.6703, 0.5572) + .. controls ( 0.6650, 0.4639) and ( 0.7377, 0.4434) .. ( 0.6703, 0.5572) + --cycle + ( 0.2950, 0.5828) + -- ( 0.3034, 0.5487) + -- ( 0.3206, 0.5487) + -- ( 0.3291, 0.5572) + -- ( 0.3291, 0.5743) + --cycle + (-0.2167, 0.5572) + .. controls (-0.2524, 0.4984) and (-0.2378, 0.4949) .. (-0.1997, 0.4463) + -- (-0.1656, 0.4548) + -- (-0.1656, 0.4719) + -- (-0.1997, 0.4804) + -- (-0.1997, 0.4719) + -- (-0.2082, 0.4804) + -- (-0.1997, 0.4804) + .. controls (-0.1944, 0.5170) and (-0.1913, 0.5288) .. (-0.2167, 0.5572) + --cycle + ( 0.4528, 0.5567) + .. controls ( 0.4208, 0.5591) and ( 0.3875, 0.5291) .. ( 0.3974, 0.4804) + -- ( 0.4998, 0.5146) + .. controls ( 0.4909, 0.5422) and ( 0.4721, 0.5552) .. ( 0.4528, 0.5567) + --cycle + (-0.5836, 0.5401) + .. controls (-0.5724, 0.5036) and (-0.5428, 0.4697) .. (-0.5238, 0.5231) + --cycle + (-0.0890, 0.5163) + .. controls (-0.1486, 0.4959) and (-0.1212, 0.4523) .. (-0.0806, 0.4615) + .. controls (-0.0429, 0.4702) and (-0.0388, 0.5108) .. (-0.0890, 0.5163) + --cycle + ( 0.3494, 0.5160) + .. controls ( 0.3442, 0.5162) and ( 0.3376, 0.5157) .. ( 0.3291, 0.5146) + -- ( 0.3632, 0.4804) + .. controls ( 0.3666, 0.5059) and ( 0.3648, 0.5149) .. ( 0.3494, 0.5160) + --cycle + ( 0.6832, 0.4635) + .. controls ( 0.6577, 0.4592) and ( 0.6354, 0.4224) .. ( 0.6277, 0.3866) + -- ( 0.6618, 0.3781) + .. controls ( 0.6758, 0.4215) and ( 0.6897, 0.4164) .. ( 0.7299, 0.4293) + .. controls ( 0.7150, 0.4573) and ( 0.6984, 0.4662) .. ( 0.6832, 0.4635) + --cycle + ( 0.3846, 0.4569) + .. controls ( 0.3643, 0.4547) and ( 0.3427, 0.4484) .. ( 0.3206, 0.4379) + .. controls ( 0.2993, 0.4278) and ( 0.2743, 0.4198) .. ( 0.2665, 0.3948) + .. controls ( 0.2602, 0.3747) and ( 0.2710, 0.3497) .. ( 0.2940, 0.3491) + .. controls ( 0.3208, 0.3484) and ( 0.3628, 0.4037) .. ( 0.4059, 0.3999) + .. controls ( 0.4648, 0.3948) and ( 0.4817, 0.3238) .. ( 0.5508, 0.3184) + -- ( 0.5594, 0.2842) + .. controls ( 0.6325, 0.3301) and ( 0.6184, 0.4000) .. ( 0.5253, 0.3610) + .. controls ( 0.4966, 0.4310) and ( 0.4457, 0.4630) .. ( 0.3846, 0.4569) + --cycle + ( 0.0020, 0.4093) + .. controls (-0.0096, 0.4099) and (-0.0218, 0.4039) .. (-0.0547, 0.3920) + .. controls (-0.0742, 0.3851) and (-0.1009, 0.3815) .. (-0.1085, 0.3591) + .. controls (-0.1143, 0.3413) and (-0.1036, 0.3179) .. (-0.0973, 0.3014) + .. controls (-0.1114, 0.2946) and (-0.1334, 0.2825) .. (-0.1485, 0.2820) + .. controls (-0.1767, 0.2809) and (-0.1949, 0.3055) .. (-0.2182, 0.3110) + .. controls (-0.2417, 0.3165) and (-0.3307, 0.2833) .. (-0.3437, 0.2635) + .. controls (-0.3530, 0.2471) and (-0.3474, 0.2253) .. (-0.3437, 0.2075) + .. controls (-0.4324, 0.1756) and (-0.3706, 0.0831) .. (-0.2765, 0.0710) + .. controls (-0.2795, 0.0550) and (-0.2801, 0.0364) .. (-0.2860, 0.0213) + .. controls (-0.2997,-0.0142) and (-0.3382,-0.0416) .. (-0.2680,-0.0825) + -- (-0.2424, 0.0027) + -- (-0.1997,-0.0143) + .. controls (-0.1918, 0.0295) and (-0.2082, 0.0371) .. (-0.1741, 0.0710) + .. controls (-0.1600, 0.0270) and (-0.1316, 0.0212) .. (-0.1230, 0.0710) + -- (-0.0547, 0.0710) + -- (-0.0547, 0.0198) + .. controls (-0.0089, 0.0346) and (-0.0127, 0.0528) .. (-0.0121, 0.0966) + .. controls ( 0.0434, 0.0981) and ( 0.0809, 0.1179) .. ( 0.0988, 0.1733) + -- ( 0.0561, 0.1477) + -- ( 0.0647, 0.1477) + -- ( 0.0647, 0.1392) + -- ( 0.0561, 0.1477) + -- (-0.0333, 0.1681) + -- (-0.0973, 0.1990) + .. controls (-0.1035, 0.1519) and (-0.0915, 0.1406) .. (-0.0462, 0.1307) + -- (-0.0547, 0.1051) + .. controls (-0.0809, 0.1134) and (-0.1575, 0.1376) .. (-0.1816, 0.1275) + .. controls (-0.1979, 0.1207) and (-0.2008, 0.1105) .. (-0.2082, 0.0966) + -- (-0.2765, 0.0796) + .. controls (-0.2913, 0.1042) and (-0.2904, 0.1037) .. (-0.3191, 0.1051) + -- (-0.3277, 0.1307) + -- (-0.3020, 0.1392) + -- (-0.3191, 0.1733) + -- (-0.2680, 0.2416) + .. controls (-0.2555, 0.2025) and (-0.2434, 0.1999) .. (-0.2082, 0.1819) + .. controls (-0.2103, 0.2198) and (-0.2204, 0.2217) .. (-0.2509, 0.2416) + -- (-0.1571, 0.2416) + -- (-0.0973, 0.1990) + .. controls (-0.0622, 0.2159) and (-0.0506, 0.2107) .. (-0.0376, 0.2501) + -- (-0.0718, 0.2672) + -- (-0.0121, 0.2842) + -- (-0.0121, 0.3014) + -- (-0.0462, 0.3184) + -- ( 0.0221, 0.3439) + .. controls ( 0.0070, 0.2950) and ( 0.0355, 0.2771) .. ( 0.0818, 0.2757) + -- ( 0.0561, 0.3354) + .. controls ( 0.1139, 0.3092) and ( 0.1160, 0.3517) .. ( 0.0949, 0.3683) + -- ( 0.0561, 0.3859) + .. controls ( 0.0248, 0.4010) and ( 0.0136, 0.4085) .. ( 0.0020, 0.4093) + --cycle + (-0.2680,-0.0825) + .. controls (-0.2752,-0.1245) and (-0.2656,-0.1332) .. (-0.2253,-0.1423) + .. controls (-0.2780,-0.1694) and (-0.3487,-0.1517) .. (-0.3277,-0.2360) + -- (-0.3958,-0.2275) + .. controls (-0.3850,-0.1662) and (-0.4133,-0.1372) .. (-0.4727,-0.1337) + -- (-0.4727,-0.0910) + .. controls (-0.5590,-0.0763) and (-0.5042,-0.0134) .. (-0.5750,-0.0228) + .. controls (-0.5589,-0.0849) and (-0.5477,-0.0819) .. (-0.5750,-0.1423) + .. controls (-0.6476,-0.1314) and (-0.6815,-0.1792) .. (-0.6262,-0.2360) + .. controls (-0.6614,-0.2507) and (-0.6863,-0.2704) .. (-0.6674,-0.3120) + .. controls (-0.6596,-0.3292) and (-0.6399,-0.3442) .. (-0.6461,-0.3629) + .. controls (-0.6528,-0.3836) and (-0.7224,-0.4151) .. (-0.6960,-0.4711) + .. controls (-0.6692,-0.5273) and (-0.5938,-0.5008) .. (-0.6603,-0.4579) + -- (-0.6262,-0.4237) + -- (-0.5921,-0.4579) + .. controls (-0.5645,-0.3552) and (-0.5902,-0.3724) .. (-0.6177,-0.2872) + -- (-0.5750,-0.2531) + -- (-0.6177,-0.2446) + -- (-0.6006,-0.2190) + .. controls (-0.5707,-0.2398) and (-0.5626,-0.2347) .. (-0.5494,-0.2019) + -- (-0.5836,-0.1848) + -- (-0.5153,-0.1592) + .. controls (-0.5297,-0.1903) and (-0.5326,-0.1983) .. (-0.4983,-0.2105) + -- (-0.4983,-0.1763) + .. controls (-0.4268,-0.1951) and (-0.4189,-0.2337) .. (-0.3789,-0.2872) + .. controls (-0.4036,-0.3020) and (-0.4028,-0.3012) .. (-0.4044,-0.3299) + -- (-0.3362,-0.3299) + .. controls (-0.3465,-0.3786) and (-0.3284,-0.3796) .. (-0.2850,-0.3811) + -- (-0.2850,-0.4151) + .. controls (-0.2401,-0.4035) and (-0.1731,-0.3767) .. (-0.1571,-0.3299) + .. controls (-0.1233,-0.3324) and (-0.1022,-0.3221) .. (-0.1230,-0.2872) + -- (-0.1143,-0.2360) + -- (-0.1741,-0.2531) + -- (-0.1741,-0.2701) + -- (-0.1485,-0.2787) + -- (-0.1571,-0.3214) + -- (-0.2765,-0.3640) + .. controls (-0.2785,-0.3286) and (-0.2853,-0.3271) .. (-0.3191,-0.3214) + -- (-0.3191,-0.3299) + -- (-0.3277,-0.3214) + -- (-0.3191,-0.3214) + .. controls (-0.3191,-0.3214) and (-0.2922,-0.3221) .. (-0.2850,-0.3128) + .. controls (-0.2781,-0.3038) and (-0.2850,-0.2787) .. (-0.2850,-0.2787) + .. controls (-0.2850,-0.2462) and (-0.2522,-0.2669) .. (-0.2424,-0.2360) + -- (-0.2935,-0.2360) + -- (-0.2509,-0.2019) + -- (-0.2424,-0.2360) + .. controls (-0.1852,-0.2624) and (-0.2046,-0.2259) .. (-0.1740,-0.2170) + .. controls (-0.1599,-0.2119) and (-0.1427,-0.2266) .. (-0.1281,-0.2170) + .. controls (-0.1166,-0.2109) and (-0.1070,-0.1747) .. (-0.1656,-0.1848) + -- (-0.2082,-0.0228) + -- (-0.2253,-0.0228) + .. controls (-0.2307,-0.0463) and (-0.2347,-0.0485) .. (-0.2167,-0.0654) + -- (-0.2253,-0.0910) + --cycle + ( 0.7385, 0.3781) + .. controls ( 0.7464, 0.3334) and ( 0.7712, 0.3235) .. ( 0.7897, 0.3696) + --cycle + ( 0.3825, 0.3684) + .. controls ( 0.3722, 0.3709) and ( 0.3598, 0.3638) .. ( 0.3547, 0.3341) + -- ( 0.3712, 0.3341) + .. controls ( 0.4107, 0.3328) and ( 0.3998, 0.3641) .. ( 0.3825, 0.3684) + --cycle + ( 0.3547, 0.3341) + -- ( 0.3034, 0.3280) + .. controls ( 0.2587, 0.3223) and ( 0.2449, 0.3331) .. ( 0.2267, 0.2842) + -- ( 0.1515, 0.2970) + .. controls ( 0.1395, 0.3001) and ( 0.1217, 0.3113) .. ( 0.1096, 0.3062) + .. controls ( 0.0947, 0.3000) and ( 0.0955, 0.2804) .. ( 0.0944, 0.2671) + .. controls ( 0.0897, 0.2118) and ( 0.0889, 0.2059) .. ( 0.1158, 0.1563) + -- ( 0.1331, 0.1563) + -- ( 0.1415, 0.1648) + -- ( 0.1415, 0.2501) + -- ( 0.2449, 0.2446) + .. controls ( 0.2870, 0.2248) and ( 0.2549, 0.1801) .. ( 0.3376, 0.1733) + -- ( 0.3376, 0.2245) + -- ( 0.3889, 0.2075) + .. controls ( 0.3692, 0.2680) and ( 0.3319, 0.2493) .. ( 0.3034, 0.2928) + .. controls ( 0.3440, 0.2858) and ( 0.3561, 0.2934) .. ( 0.3547, 0.3341) + --cycle + ( 0.4285, 0.3341) + .. controls ( 0.4111, 0.3048) and ( 0.4418, 0.2997) .. ( 0.4508, 0.3082) + .. controls ( 0.4603, 0.3170) and ( 0.4582, 0.3376) .. ( 0.4285, 0.3341) + --cycle + ( 0.7199, 0.3309) + .. controls ( 0.7120, 0.3311) and ( 0.7041, 0.3301) .. ( 0.6963, 0.3276) + .. controls ( 0.6516, 0.3141) and ( 0.5998, 0.2127) .. ( 0.6788, 0.2075) + -- ( 0.6874, 0.1819) + .. controls ( 0.6908, 0.1882) and ( 0.6948, 0.1871) .. ( 0.6958, 0.2009) + .. controls ( 0.6967, 0.2152) and ( 0.6850, 0.2341) .. ( 0.6875, 0.2482) + .. controls ( 0.6912, 0.2697) and ( 0.7185, 0.2790) .. ( 0.7404, 0.2558) + -- ( 0.7556, 0.2330) + .. controls ( 0.8209, 0.2699) and ( 0.7743, 0.3292) .. ( 0.7199, 0.3309) + --cycle + (-0.4641, 0.3269) + -- (-0.4556, 0.2928) + -- (-0.4386, 0.2928) + -- (-0.4300, 0.3269) + --cycle + (-0.3532, 0.3269) + .. controls (-0.3838, 0.3252) and (-0.3857, 0.3233) .. (-0.3874, 0.2928) + .. controls (-0.3613, 0.3019) and (-0.3623, 0.3007) .. (-0.3532, 0.3269) + --cycle + (-0.7723, 0.3114) + .. controls (-0.9303, 0.2491) and (-0.8236, 0.1766) .. (-0.9066, 0.1318) + .. controls (-0.9222, 0.1231) and (-0.9315, 0.1156) .. (-0.9385, 0.1084) + -- (-0.9505, 0.0875) + .. controls (-0.9537, 0.0757) and (-0.9542, 0.0621) .. (-0.9542, 0.0410) + -- (-0.9333, 0.0454) + .. controls (-0.9116, 0.1020) and (-0.8383, 0.0970) .. (-0.8943, 0.1349) + .. controls (-0.8577, 0.1472) and (-0.8473, 0.1249) .. (-0.8748, 0.1652) + -- (-0.8414, 0.1559) + .. controls (-0.8055, 0.1614) and (-0.8119, 0.2075) .. (-0.8279, 0.2170) + .. controls (-0.8020, 0.2197) and (-0.8300, 0.2698) .. (-0.8062, 0.2572) + .. controls (-0.7862, 0.2467) and (-0.7713, 0.2258) .. (-0.7547, 0.2261) + .. controls (-0.7211, 0.2267) and (-0.7384, 0.2895) .. (-0.7723, 0.3114) + --cycle + ( 0.5167, 0.2928) + -- ( 0.5083, 0.2842) + -- ( 0.5083, 0.2672) + -- ( 0.5167, 0.2587) + -- ( 0.5338, 0.2587) + -- ( 0.5423, 0.2672) + -- ( 0.5423, 0.2842) + -- ( 0.5338, 0.2928) + --cycle + ( 0.8233, 0.2914) + .. controls ( 0.8159, 0.2897) and ( 0.8101, 0.2823) .. ( 0.8101, 0.2664) + .. controls ( 0.8101, 0.2592) and ( 0.7901, 0.2245) .. ( 0.7943, 0.2184) + .. controls ( 0.8010, 0.2085) and ( 0.8177, 0.1916) .. ( 0.8341, 0.1843) + -- ( 0.7897, 0.1051) + .. controls ( 0.7638, 0.1109) and ( 0.6977, 0.1143) .. ( 0.6790, 0.0913) + .. controls ( 0.6678, 0.0772) and ( 0.6727, 0.0528) .. ( 0.6644, 0.0283) + .. controls ( 0.6511,-0.0104) and ( 0.6263,-0.0275) .. ( 0.5936,-0.0484) + .. controls ( 0.5977,-0.0521) and ( 0.6009,-0.0593) .. ( 0.6125,-0.0633) + .. controls ( 0.6432,-0.0738) and ( 0.6954,-0.0310) .. ( 0.7067,-0.0043) + .. controls ( 0.7123, 0.0088) and ( 0.7121, 0.0229) .. ( 0.7130, 0.0368) + .. controls ( 0.7585, 0.0333) and ( 0.7707, 0.0484) .. ( 0.7897, 0.0881) + -- ( 0.8409, 0.0027) + .. controls ( 0.7828,-0.0157) and ( 0.7583,-0.0941) .. ( 0.8409,-0.1337) + .. controls ( 0.8561,-0.0647) and ( 0.8176,-0.0742) .. ( 0.8836,-0.0143) + -- ( 0.9348,-0.0654) + .. controls ( 0.9443,-0.0311) and ( 0.9398,-0.0319) .. ( 0.9430,-0.0008) + .. controls ( 0.9475, 0.0433) and ( 0.9603, 0.0556) .. ( 0.8921, 0.0796) + -- ( 0.8836, 0.0710) + -- ( 0.8836, 0.0540) + -- ( 0.9006, 0.0198) + .. controls ( 0.8705, 0.0555) and ( 0.8589, 0.0671) .. ( 0.8494, 0.1137) + -- ( 0.8921, 0.0881) + .. controls ( 0.9100, 0.1275) and ( 0.9093, 0.1211) .. ( 0.9077, 0.1641) + .. controls ( 0.8502, 0.2199) and ( 0.8502, 0.2055) .. ( 0.8245, 0.2294) + .. controls ( 0.8511, 0.2387) and ( 0.8571, 0.2533) .. ( 0.8546, 0.2660) + -- ( 0.8445, 0.2834) + .. controls ( 0.8380, 0.2892) and ( 0.8301, 0.2928) .. ( 0.8233, 0.2914) + --cycle + (-0.6221, 0.2851) + .. controls (-0.6403, 0.2814) and (-0.6578, 0.2533) .. (-0.6578, 0.2330) + .. controls (-0.6578, 0.2083) and (-0.6228, 0.1685) .. (-0.6090, 0.1392) + .. controls (-0.6712, 0.1174) and (-0.6013, 0.0486) .. (-0.5914, 0.0454) + .. controls (-0.5625, 0.0361) and (-0.5594, 0.0690) .. (-0.5384, 0.0751) + .. controls (-0.5161, 0.0820) and (-0.5142, 0.0619) .. (-0.4641, 0.0796) + .. controls (-0.4838, 0.1372) and (-0.5135, 0.1504) .. (-0.5665, 0.1733) + -- (-0.5323, 0.2075) + -- (-0.5665, 0.2160) + -- (-0.5665, 0.1819) + -- (-0.5921, 0.2245) + -- (-0.6006, 0.2330) + -- (-0.6090, 0.2416) + -- (-0.6006, 0.2416) + -- (-0.6006, 0.2330) + -- (-0.5921, 0.2330) + -- (-0.5921, 0.2245) + .. controls (-0.5591, 0.2361) and (-0.5513, 0.2585) .. (-0.5921, 0.2587) + .. controls (-0.5999, 0.2809) and (-0.6112, 0.2874) .. (-0.6221, 0.2851) + --cycle + (-0.4001, 0.2659) + -- (-0.4398, 0.2231) + -- (-0.4713, 0.1989) + .. controls (-0.5030, 0.1708) and (-0.4873, 0.1496) .. (-0.4486, 0.1607) + .. controls (-0.4215, 0.1683) and (-0.3832, 0.1951) .. (-0.3704, 0.2199) + .. controls (-0.3565, 0.2464) and (-0.3702, 0.2690) .. (-0.4001, 0.2659) + --cycle + ( 0.5167, 0.2501) + .. controls ( 0.4726, 0.2275) and ( 0.4751, 0.2109) .. ( 0.4771, 0.1648) + .. controls ( 0.4776, 0.1495) and ( 0.4771, 0.1247) .. ( 0.4946, 0.1178) + .. controls ( 0.5149, 0.1096) and ( 0.5288, 0.1359) .. ( 0.5681, 0.1435) + .. controls ( 0.6164, 0.1530) and ( 0.6391, 0.1274) .. ( 0.6568, 0.1214) + .. controls ( 0.6669, 0.1180) and ( 0.6795, 0.1163) .. ( 0.6862, 0.1272) + .. controls ( 0.7003, 0.1512) and ( 0.6673, 0.1556) .. ( 0.6532, 0.1563) + .. controls ( 0.6261, 0.2314) and ( 0.5966, 0.1859) .. ( 0.5605, 0.1960) + .. controls ( 0.5390, 0.2022) and ( 0.5268, 0.2319) .. ( 0.5167, 0.2501) + --cycle + (-0.0462, 0.2075) + -- (-0.0462, 0.1819) + -- (-0.0206, 0.1819) + -- (-0.0206, 0.2075) + --cycle + (-0.7371, 0.1990) + -- (-0.7371, 0.1563) + -- (-0.7115, 0.1905) + -- (-0.7200, 0.1990) + --cycle + (-0.1656, 0.1905) + -- (-0.1400, 0.1648) + --cycle + (-0.7797, 0.1819) + -- (-0.7883, 0.1733) + -- (-0.7883, 0.1563) + -- (-0.7542, 0.1477) + -- (-0.7627, 0.1819) + --cycle + ( 0.1671, 0.1819) + -- ( 0.1841, 0.1477) + --cycle + ( 0.6447, 0.1477) + -- ( 0.6532, 0.1477) + -- ( 0.6532, 0.1392) + --cycle + (-0.7081, 0.1437) + .. controls (-0.7387, 0.1429) and (-0.7462, 0.1254) .. (-0.7593, 0.0844) + .. controls (-0.7628, 0.0670) and (-0.7720, 0.0499) .. (-0.7593, 0.0321) + .. controls (-0.7496, 0.0145) and (-0.7241, 0.0137) .. (-0.7173, 0.0321) + .. controls (-0.7114, 0.0479) and (-0.7222, 0.0657) .. (-0.7285, 0.0796) + .. controls (-0.6938, 0.0968) and (-0.6811, 0.1011) .. (-0.6688, 0.1392) + .. controls (-0.6852, 0.1425) and (-0.6979, 0.1439) .. (-0.7081, 0.1437) + --cycle + ( 0.8921, 0.1392) + -- ( 0.9006, 0.1392) + -- ( 0.9006, 0.1307) + --cycle + ( 0.5765, 0.1222) + -- ( 0.5850, 0.0881) + -- ( 0.6021, 0.0881) + -- ( 0.6106, 0.1222) + --cycle + ( 0.2872, 0.1175) + .. controls ( 0.2767, 0.1166) and ( 0.2651, 0.1135) .. ( 0.2533, 0.1071) + .. controls ( 0.2151, 0.0867) and ( 0.2220, 0.0479) .. ( 0.2267, 0.0113) + .. controls ( 0.2625, 0.0237) and ( 0.2504, 0.0254) .. ( 0.2701, 0.0519) + .. controls ( 0.2958, 0.0863) and ( 0.3249, 0.0559) .. ( 0.3338, 0.0822) + .. controls ( 0.3402, 0.1009) and ( 0.3185, 0.1198) .. ( 0.2872, 0.1175) + --cycle + ( 0.4845, 0.1051) + .. controls ( 0.4706, 0.1009) and ( 0.4616, 0.0995) .. ( 0.4512, 0.0905) + .. controls ( 0.4040, 0.0493) and ( 0.4796,-0.0172) .. ( 0.4845, 0.0710) + .. controls ( 0.4877, 0.0867) and ( 0.4856, 0.0907) .. ( 0.4845, 0.1051) + --cycle + ( 0.6362, 0.1051) + -- ( 0.6277, 0.0966) + -- ( 0.6277, 0.0796) + -- ( 0.6618, 0.0710) + -- ( 0.6532, 0.1051) + --cycle + ( 0.0988, 0.0966) + -- ( 0.0647, 0.0881) + -- ( 0.0647, 0.0710) + -- ( 0.0902, 0.0625) + .. controls ( 0.0813, 0.0194) and ( 0.0842, 0.0065) .. ( 0.1244,-0.0143) + -- ( 0.1331, 0.0283) + -- ( 0.1671, 0.0368) + -- ( 0.1671, 0.0540) + .. controls ( 0.1326, 0.0659) and ( 0.1186, 0.0637) .. ( 0.0988, 0.0966) + --cycle + (-0.8125, 0.0621) + .. controls (-0.8490, 0.0401) and (-0.8237, 0.0162) .. (-0.8062, 0.0190) + .. controls (-0.7883, 0.0219) and (-0.7704, 0.0544) .. (-0.8125, 0.0621) + --cycle + ( 0.5167, 0.0540) + -- ( 0.5083, 0.0198) + -- ( 0.5423, 0.0283) + -- ( 0.5423, 0.0454) + -- ( 0.5338, 0.0540) + --cycle + (-0.0973, 0.0454) + -- (-0.1058, 0.0368) + -- (-0.1058, 0.0198) + -- (-0.0718, 0.0113) + -- (-0.0802, 0.0454) + --cycle + (-0.0035, 0.0368) + -- (-0.0210, 0.0109) + .. controls (-0.0655,-0.0708) and ( 0.0385,-0.0566) .. ( 0.0166, 0.0109) + .. controls ( 0.0120, 0.0245) and ( 0.0056, 0.0275) .. (-0.0035, 0.0368) + --cycle + (-0.4977, 0.0207) + .. controls (-0.5147, 0.0204) and (-0.5312, 0.0080) .. (-0.5211,-0.0096) + .. controls (-0.5118,-0.0261) and (-0.4926,-0.0166) .. (-0.4645,-0.0487) + .. controls (-0.4440,-0.0720) and (-0.4524,-0.0706) .. (-0.4214,-0.0825) + .. controls (-0.4050,-0.0235) and (-0.4308, 0.0217) .. (-0.4977, 0.0207) + --cycle + ( 0.3756, 0.0075) + .. controls ( 0.3646, 0.0069) and ( 0.3522, 0.0045) .. ( 0.3376, 0.0002) + .. controls ( 0.3227,-0.0042) and ( 0.3054,-0.0075) .. ( 0.2946,-0.0193) + -- ( 0.2742,-0.0568) + .. controls ( 0.2649,-0.0745) and ( 0.2554,-0.0861) .. ( 0.2571,-0.1073) + .. controls ( 0.2601,-0.1471) and ( 0.2967,-0.2295) .. ( 0.3408,-0.1666) + .. controls ( 0.3653,-0.1317) and ( 0.3284,-0.1299) .. ( 0.3717,-0.0654) + .. controls ( 0.4033,-0.0789) and ( 0.4049,-0.0788) .. ( 0.4314,-0.0568) + .. controls ( 0.4664,-0.1165) and ( 0.5153,-0.0409) .. ( 0.5152,-0.0308) + .. controls ( 0.5148,-0.0111) and ( 0.4690, 0.0277) .. ( 0.4571,-0.0399) + .. controls ( 0.4280,-0.0054) and ( 0.4082, 0.0095) .. ( 0.3756, 0.0075) + --cycle + (-0.9801, 0.0047) + -- (-0.9427,-0.0792) + -- (-0.8931,-0.0669) + -- (-0.8538,-0.0818) + .. controls (-0.8464,-0.0219) and (-0.9339,-0.0180) .. (-0.9801, 0.0047) + --cycle + ( 0.5423,-0.0484) + -- ( 0.5594,-0.0997) + .. controls ( 0.5416,-0.1040) and ( 0.4986,-0.1096) .. ( 0.4864,-0.1181) + .. controls ( 0.4658,-0.1324) and ( 0.4601,-0.1677) .. ( 0.4793,-0.1854) + .. controls ( 0.4883,-0.1938) and ( 0.5053,-0.1981) .. ( 0.5167,-0.2019) + .. controls ( 0.4933,-0.2045) and ( 0.4609,-0.2005) .. ( 0.4427,-0.2156) + .. controls ( 0.4166,-0.2372) and ( 0.4089,-0.2872) .. ( 0.4826,-0.2957) + -- ( 0.4826,-0.2446) + .. controls ( 0.5217,-0.2597) and ( 0.5287,-0.2486) .. ( 0.5167,-0.2105) + .. controls ( 0.5424,-0.2023) and ( 0.5512,-0.1934) .. ( 0.5594,-0.1677) + -- ( 0.6191,-0.1848) + -- ( 0.6788,-0.3042) + -- ( 0.6532,-0.3128) + -- ( 0.6532,-0.3299) + -- ( 0.7385,-0.3214) + -- ( 0.7130,-0.2617) + .. controls ( 0.7337,-0.2558) and ( 0.7608,-0.2439) .. ( 0.7812,-0.2454) + .. controls ( 0.7973,-0.2453) and ( 0.8226,-0.2581) .. ( 0.8346,-0.2454) + .. controls ( 0.8523,-0.2285) and ( 0.8216,-0.2043) .. ( 0.8067,-0.1989) + .. controls ( 0.7691,-0.1854) and ( 0.7439,-0.2093) .. ( 0.6805,-0.1933) + -- ( 0.6805,-0.1448) + -- ( 0.6017,-0.0907) + -- ( 0.5680,-0.0907) + -- ( 0.5765,-0.0484) + --cycle + (-0.7372,-0.0610) + .. controls (-0.7812,-0.0612) and (-0.8222,-0.0885) .. (-0.7969,-0.1508) + -- (-0.8546,-0.1518) + .. controls (-0.8578,-0.0809) and (-0.9199,-0.0961) .. (-0.9322,-0.1220) + -- (-0.9145,-0.1528) + .. controls (-0.9119,-0.1539) and (-0.9110,-0.1554) .. (-0.9080,-0.1566) + .. controls (-0.8746,-0.1628) and (-0.8911,-0.2081) .. (-0.8709,-0.2184) + .. controls (-0.8479,-0.2301) and (-0.8289,-0.2160) .. (-0.8075,-0.2238) + .. controls (-0.7880,-0.2309) and (-0.7418,-0.2959) .. (-0.7285,-0.2190) + -- (-0.7712,-0.2105) + .. controls (-0.7608,-0.1935) and (-0.7474,-0.1633) .. (-0.7309,-0.1535) + .. controls (-0.7132,-0.1433) and (-0.6647,-0.1458) .. (-0.6532,-0.1225) + .. controls (-0.6410,-0.0974) and (-0.6763,-0.0776) .. (-0.6945,-0.0697) + .. controls (-0.7075,-0.0641) and (-0.7225,-0.0610) .. (-0.7372,-0.0610) + --cycle + ( 0.0790,-0.0703) + .. controls ( 0.0586,-0.0724) and ( 0.0391,-0.0799) .. ( 0.0314,-0.0938) + .. controls ( 0.0258,-0.1059) and ( 0.0293,-0.1207) .. ( 0.0314,-0.1337) + .. controls (-0.0051,-0.1451) and (-0.0235,-0.1672) .. ( 0.0136,-0.1933) + -- ( 0.0050,-0.2190) + -- ( 0.0647,-0.2360) + -- ( 0.0561,-0.2019) + -- ( 0.0391,-0.2105) + -- ( 0.0307,-0.2019) + -- ( 0.0818,-0.1251) + -- ( 0.0988,-0.1251) + .. controls ( 0.1190,-0.1566) and ( 0.1311,-0.1660) .. ( 0.1671,-0.1763) + .. controls ( 0.1712,-0.1381) and ( 0.1680,-0.1029) .. ( 0.1325,-0.0792) + .. controls ( 0.1208,-0.0715) and ( 0.0994,-0.0682) .. ( 0.0790,-0.0703) + --cycle + (-0.0347,-0.0729) + .. controls (-0.0400,-0.0723) and (-0.0465,-0.0725) .. (-0.0547,-0.0739) + .. controls (-0.1154,-0.1097) and (-0.0914,-0.1419) .. (-0.0629,-0.1331) + .. controls (-0.0318,-0.1235) and ( 0.0014,-0.0769) .. (-0.0347,-0.0729) + --cycle + (-0.1485,-0.0997) + -- (-0.1656,-0.1166) + -- (-0.1656,-0.1251) + .. controls (-0.1656,-0.1251) and (-0.1284,-0.1383) .. (-0.1230,-0.1251) + .. controls (-0.1184,-0.1140) and (-0.1485,-0.0997) .. (-0.1485,-0.0997) + --cycle + ( 0.8579,-0.1251) + -- ( 0.8579,-0.1508) + -- ( 0.8921,-0.1508) + -- ( 0.8921,-0.1251) + --cycle + ( 0.3462,-0.1848) + .. controls ( 0.3553,-0.2111) and ( 0.3541,-0.2099) .. ( 0.3804,-0.2190) + .. controls ( 0.3789,-0.1929) and ( 0.3722,-0.1863) .. ( 0.3462,-0.1848) + --cycle + ( 0.5680,-0.2105) + -- ( 0.5680,-0.2360) + -- ( 0.5936,-0.2360) + -- ( 0.5936,-0.2105) + --cycle + ( 0.2429,-0.2175) + .. controls ( 0.2301,-0.2183) and ( 0.2146,-0.2250) .. ( 0.2042,-0.2351) + .. controls ( 0.1851,-0.2515) and ( 0.1867,-0.2802) .. ( 0.1841,-0.3042) + -- ( 0.2267,-0.3128) + .. controls ( 0.2366,-0.2535) and ( 0.2673,-0.2625) .. ( 0.2665,-0.2351) + .. controls ( 0.2661,-0.2218) and ( 0.2558,-0.2167) .. ( 0.2429,-0.2175) + --cycle + (-0.8394,-0.2360) + .. controls (-0.8657,-0.2452) and (-0.8037,-0.2814) .. (-0.8128,-0.3076) + .. controls (-0.7841,-0.3060) and (-0.8155,-0.2595) .. (-0.8394,-0.2360) + --cycle + (-0.3106,-0.2446) + .. controls (-0.3061,-0.2411) and (-0.2935,-0.2446) .. (-0.2935,-0.2446) + .. controls (-0.2935,-0.2446) and (-0.3063,-0.2847) .. (-0.3191,-0.2787) + .. controls (-0.3297,-0.2736) and (-0.3199,-0.2518) .. (-0.3106,-0.2446) + --cycle + ( 0.0809,-0.2495) + .. controls ( 0.0629,-0.2468) and ( 0.0475,-0.2563) .. ( 0.0307,-0.2602) + .. controls ( 0.0102,-0.2651) and (-0.0913,-0.2616) .. (-0.0376,-0.3640) + .. controls (-0.1141,-0.3685) and (-0.1262,-0.4016) .. (-0.0926,-0.4664) + .. controls (-0.0856,-0.4795) and (-0.0758,-0.5040) .. (-0.0668,-0.5138) + .. controls (-0.0449,-0.5377) and ( 0.0001,-0.5440) .. ( 0.0307,-0.5431) + -- ( 0.0221,-0.4579) + -- (-0.0206,-0.4833) + .. controls (-0.0180,-0.4388) and (-0.0055,-0.4140) .. (-0.0633,-0.4237) + .. controls (-0.0215,-0.3935) and (-0.0083,-0.4022) .. ( 0.0050,-0.3640) + -- ( 0.0476,-0.3555) + -- ( 0.0476,-0.3384) + .. controls ( 0.0149,-0.3341) and ( 0.0150,-0.3375) .. (-0.0035,-0.3640) + .. controls (-0.0031,-0.3175) and ( 0.0507,-0.3021) .. ( 0.0895,-0.3132) + .. controls ( 0.0967,-0.3153) and ( 0.1020,-0.3182) .. ( 0.1069,-0.3214) + -- ( 0.0733,-0.3214) + -- ( 0.0733,-0.3555) + -- ( 0.1073,-0.3555) + -- ( 0.1073,-0.3217) + .. controls ( 0.1209,-0.3306) and ( 0.1314,-0.3431) .. ( 0.1671,-0.3555) + .. controls ( 0.1861,-0.3011) and ( 0.1658,-0.3044) .. ( 0.1276,-0.2793) + .. controls ( 0.1121,-0.2692) and ( 0.1003,-0.2524) .. ( 0.0809,-0.2495) + --cycle + ( 0.5253,-0.2617) + .. controls ( 0.5159,-0.2894) and ( 0.5137,-0.2935) .. ( 0.5423,-0.3042) + --cycle + (-0.5836,-0.2872) + -- (-0.5921,-0.3299) + .. controls (-0.5632,-0.3196) and (-0.5624,-0.3175) .. (-0.5665,-0.2872) + --cycle + ( 0.4825,-0.3113) + .. controls ( 0.4709,-0.3098) and ( 0.4621,-0.3187) .. ( 0.4571,-0.3470) + .. controls ( 0.4065,-0.2945) and ( 0.3565,-0.3080) .. ( 0.3141,-0.3613) + .. controls ( 0.3029,-0.3754) and ( 0.2880,-0.3874) .. ( 0.2903,-0.4075) + .. controls ( 0.2921,-0.4247) and ( 0.3027,-0.4361) .. ( 0.3120,-0.4493) + .. controls ( 0.2945,-0.4516) and ( 0.2350,-0.4574) .. ( 0.2234,-0.4665) + .. controls ( 0.2011,-0.4843) and ( 0.2099,-0.5378) .. ( 0.2182,-0.5602) + -- ( 0.2352,-0.5602) + .. controls ( 0.2421,-0.5417) and ( 0.2492,-0.5116) .. ( 0.2706,-0.5071) + .. controls ( 0.3048,-0.4961) and ( 0.3439,-0.5674) .. ( 0.3618,-0.5071) + -- ( 0.3618,-0.4833) + -- ( 0.3974,-0.4919) + -- ( 0.4059,-0.4579) + -- ( 0.3376,-0.4493) + -- ( 0.3717,-0.3896) + .. controls ( 0.4306,-0.3991) and ( 0.4623,-0.4570) .. ( 0.4656,-0.3640) + .. controls ( 0.4971,-0.3707) and ( 0.5062,-0.3751) .. ( 0.5253,-0.3470) + -- ( 0.5451,-0.3694) + .. controls ( 0.6171,-0.4271) and ( 0.5795,-0.2610) .. ( 0.5253,-0.3384) + .. controls ( 0.5089,-0.3248) and ( 0.4943,-0.3128) .. ( 0.4825,-0.3113) + --cycle + ( 0.6371,-0.3426) + .. controls ( 0.6165,-0.3414) and ( 0.6075,-0.3499) .. ( 0.6021,-0.3811) + .. controls ( 0.6375,-0.3781) and ( 0.6440,-0.3786) .. ( 0.6618,-0.3470) + .. controls ( 0.6521,-0.3447) and ( 0.6439,-0.3431) .. ( 0.6371,-0.3426) + --cycle + ( 0.1158,-0.3640) + -- ( 0.1073,-0.3981) + -- ( 0.1415,-0.3981) + -- ( 0.1331,-0.3640) + --cycle + (-0.4660,-0.3701) + .. controls (-0.4757,-0.3670) and (-0.4894,-0.3727) .. (-0.4983,-0.3981) + -- (-0.5580,-0.3811) + .. controls (-0.5508,-0.4276) and (-0.5277,-0.4685) .. (-0.4812,-0.4833) + -- (-0.4898,-0.4066) + .. controls (-0.4444,-0.4042) and (-0.4498,-0.3750) .. (-0.4660,-0.3701) + --cycle + ( 0.1671,-0.3724) + -- ( 0.1585,-0.3811) + -- ( 0.1671,-0.4407) + -- ( 0.1927,-0.4322) + -- ( 0.1927,-0.3811) + -- ( 0.1841,-0.3724) + --cycle + (-0.4061,-0.3746) + .. controls (-0.4337,-0.3682) and (-0.4432,-0.4275) .. (-0.3933,-0.4421) + .. controls (-0.3807,-0.4474) and (-0.3733,-0.4433) .. (-0.3617,-0.4421) + .. controls (-0.3654,-0.4287) and (-0.3677,-0.4184) .. (-0.3740,-0.4070) + .. controls (-0.3858,-0.3861) and (-0.3969,-0.3767) .. (-0.4061,-0.3746) + --cycle + (-0.2091,-0.4066) + -- (-0.2091,-0.4298) + -- (-0.1315,-0.5004) + .. controls (-0.1221,-0.4446) and (-0.1606,-0.4228) .. (-0.2091,-0.4066) + --cycle + ( 0.6634,-0.4202) + .. controls ( 0.6063,-0.4164) and ( 0.5403,-0.4628) .. ( 0.5936,-0.5175) + .. controls ( 0.5533,-0.5676) and ( 0.6039,-0.5913) .. ( 0.6362,-0.5261) + -- ( 0.6021,-0.5175) + -- ( 0.6618,-0.5004) + -- ( 0.6874,-0.5261) + -- ( 0.6532,-0.4749) + -- ( 0.6618,-0.4664) + .. controls ( 0.6767,-0.4763) and ( 0.6924,-0.4939) .. ( 0.7031,-0.4938) + .. controls ( 0.7482,-0.4516) and ( 0.7588,-0.4217) .. ( 0.6869,-0.4249) + .. controls ( 0.6795,-0.4222) and ( 0.6716,-0.4207) .. ( 0.6634,-0.4202) + --cycle + (-0.2595,-0.4322) + -- (-0.2680,-0.4407) + -- (-0.2680,-0.4579) + -- (-0.2595,-0.4664) + -- (-0.2424,-0.4664) + -- (-0.2338,-0.4579) + -- (-0.2338,-0.4407) + -- (-0.2424,-0.4322) + --cycle + (-0.3947,-0.4820) + .. controls (-0.4064,-0.4819) and (-0.4202,-0.4884) .. (-0.4300,-0.4906) + .. controls (-0.4705,-0.5000) and (-0.4926,-0.4888) .. (-0.4812,-0.5431) + .. controls (-0.4962,-0.5405) and (-0.5172,-0.5356) .. (-0.5319,-0.5380) + .. controls (-0.5497,-0.5409) and (-0.6218,-0.5786) .. (-0.6276,-0.5954) + .. controls (-0.6443,-0.6458) and (-0.5896,-0.6294) .. (-0.5665,-0.6198) + -- (-0.5750,-0.6455) + -- (-0.5409,-0.6540) + -- (-0.5409,-0.6198) + -- (-0.4727,-0.5943) + -- (-0.4812,-0.6370) + -- (-0.4641,-0.6028) + -- (-0.4214,-0.6796) + -- (-0.4044,-0.6796) + .. controls (-0.3922,-0.6110) and (-0.4199,-0.5974) .. (-0.4386,-0.5431) + -- (-0.4053,-0.5384) + .. controls (-0.3682,-0.5271) and (-0.3698,-0.4934) .. (-0.3840,-0.4848) + .. controls (-0.3872,-0.4829) and (-0.3908,-0.4821) .. (-0.3947,-0.4820) + --cycle + (-0.2509,-0.4833) + .. controls (-0.2897,-0.5056) and (-0.2886,-0.5289) .. (-0.2509,-0.5516) + -- (-0.2509,-0.5688) + .. controls (-0.3046,-0.5780) and (-0.3807,-0.5721) .. (-0.3362,-0.6796) + .. controls (-0.3905,-0.7060) and (-0.4127,-0.7567) .. (-0.3447,-0.7820) + -- (-0.3305,-0.8084) + .. controls (-0.3952,-0.8150) and (-0.4330,-0.7851) .. (-0.3796,-0.8551) + .. controls (-0.3707,-0.8560) and (-0.2665,-0.8846) .. (-0.3191,-0.8587) + .. controls (-0.2670,-0.8376) and (-0.2955,-0.8083) .. (-0.3191,-0.7735) + .. controls (-0.2852,-0.7626) and (-0.2805,-0.7579) .. (-0.2850,-0.7222) + -- (-0.3277,-0.7393) + -- (-0.3277,-0.6796) + .. controls (-0.2965,-0.6680) and (-0.3000,-0.6597) .. (-0.3020,-0.6285) + .. controls (-0.2349,-0.6402) and (-0.2059,-0.6119) .. (-0.1513,-0.6666) + .. controls (-0.1144,-0.7033) and (-0.1214,-0.7764) .. (-0.0716,-0.7828) + .. controls (-0.0398,-0.7870) and (-0.0581,-0.7438) .. (-0.0633,-0.7307) + .. controls (-0.0105,-0.7419) and (-0.0101,-0.7107) .. (-0.0259,-0.6944) + .. controls (-0.0416,-0.6781) and (-0.0638,-0.6847) .. (-0.0920,-0.6613) + .. controls (-0.1363,-0.6245) and (-0.1312,-0.5893) .. (-0.2253,-0.5516) + --cycle + ( 0.0893,-0.4928) + .. controls ( 0.0854,-0.4941) and ( 0.0816,-0.4977) .. ( 0.0781,-0.5045) + .. controls ( 0.0717,-0.5167) and ( 0.0733,-0.5538) .. ( 0.0733,-0.5688) + .. controls (-0.0068,-0.5661) and ( 0.0229,-0.6522) .. ( 0.0360,-0.6661) + .. controls ( 0.0456,-0.6761) and ( 0.0531,-0.6759) .. ( 0.0647,-0.6796) + -- ( 0.0647,-0.6198) + -- ( 0.1244,-0.6113) + -- ( 0.1073,-0.5773) + -- ( 0.1331,-0.5688) + .. controls ( 0.1502,-0.5983) and ( 0.1514,-0.6011) .. ( 0.1841,-0.6113) + .. controls ( 0.1815,-0.5647) and ( 0.1767,-0.5414) .. ( 0.1244,-0.5431) + -- ( 0.1174,-0.5185) + .. controls ( 0.1127,-0.5047) and ( 0.1008,-0.4886) .. ( 0.0893,-0.4928) + --cycle + ( 0.0647,-0.6796) + .. controls ( 0.0651,-0.7162) and ( 0.0755,-0.7152) .. ( 0.1073,-0.7052) + .. controls ( 0.0927,-0.6800) and ( 0.0939,-0.6798) .. ( 0.0647,-0.6796) + --cycle + ( 0.4429,-0.5307) + .. controls ( 0.4305,-0.5311) and ( 0.4171,-0.5380) .. ( 0.4059,-0.5558) + .. controls ( 0.3999,-0.5655) and ( 0.3989,-0.5750) .. ( 0.3994,-0.5861) + .. controls ( 0.3998,-0.5978) and ( 0.4033,-0.6088) .. ( 0.4059,-0.6198) + .. controls ( 0.4351,-0.6096) and ( 0.4347,-0.6075) .. ( 0.4400,-0.5773) + .. controls ( 0.5088,-0.5860) and ( 0.4802,-0.5296) .. ( 0.4429,-0.5307) + --cycle + ( 0.6296,-0.5636) + .. controls ( 0.6201,-0.5648) and ( 0.6129,-0.5872) .. ( 0.5850,-0.6007) + .. controls ( 0.5662,-0.6071) and ( 0.5466,-0.6101) .. ( 0.5358,-0.6303) + .. controls ( 0.5238,-0.6524) and ( 0.5014,-0.6717) .. ( 0.5092,-0.6929) + .. controls ( 0.4879,-0.7051) and ( 0.4594,-0.7105) .. ( 0.4574,-0.7383) + .. controls ( 0.4557,-0.7622) and ( 0.5198,-0.8058) .. ( 0.5459,-0.7885) + .. controls ( 0.5602,-0.7791) and ( 0.4924,-0.7612) .. ( 0.5176,-0.7262) + -- ( 0.5713,-0.7309) + .. controls ( 0.6461,-0.7123) and ( 0.5265,-0.6556) .. ( 0.6262,-0.6344) + .. controls ( 0.6303,-0.6340) and ( 0.6389,-0.6314) .. ( 0.6474,-0.6278) + -- ( 0.6629,-0.6006) + .. controls ( 0.6611,-0.5976) and ( 0.6583,-0.5944) .. ( 0.6541,-0.5908) + .. controls ( 0.6418,-0.5698) and ( 0.6353,-0.5628) .. ( 0.6296,-0.5636) + --cycle + ( 0.2723,-0.5991) + .. controls ( 0.2592,-0.6003) and ( 0.2468,-0.6028) .. ( 0.2363,-0.6064) + .. controls ( 0.1997,-0.6189) and ( 0.1915,-0.6622) .. ( 0.2438,-0.6796) + -- ( 0.2524,-0.6540) + -- ( 0.2694,-0.6540) + -- ( 0.2438,-0.6796) + -- ( 0.2352,-0.7052) + .. controls ( 0.1815,-0.6689) and ( 0.1445,-0.7418) .. ( 0.2182,-0.7649) + .. controls ( 0.2103,-0.7956) and ( 0.2084,-0.7983) .. ( 0.2267,-0.8246) + .. controls ( 0.1155,-0.7748) and ( 0.1095,-0.9097) .. ( 0.1942,-0.8505) + -- ( 0.2141,-0.8675) + .. controls ( 0.2535,-0.8323) and ( 0.2056,-0.8655) .. ( 0.2756,-0.8643) + -- ( 0.2903,-0.8720) + -- ( 0.3279,-0.8720) + -- ( 0.3427,-0.8612) + .. controls ( 0.3869,-0.8663) and ( 0.4661,-0.8748) .. ( 0.4741,-0.8502) + .. controls ( 0.5431,-0.8855) and ( 0.5233,-0.7888) .. ( 0.5039,-0.8143) + .. controls ( 0.4752,-0.7958) and ( 0.5046,-0.8131) .. ( 0.4741,-0.8331) + .. controls ( 0.3949,-0.7997) and ( 0.4522,-0.8406) .. ( 0.3683,-0.8327) + .. controls ( 0.3744,-0.7942) and ( 0.4288,-0.7829) .. ( 0.4051,-0.7307) + .. controls ( 0.4260,-0.7007) and ( 0.4185,-0.6946) .. ( 0.4051,-0.6626) + .. controls ( 0.3990,-0.6503) and ( 0.3940,-0.6359) .. ( 0.3839,-0.6265) + .. controls ( 0.3585,-0.6027) and ( 0.3119,-0.5953) .. ( 0.2723,-0.5991) + --cycle + (-0.2424,-0.6455) + -- (-0.2424,-0.6796) + -- (-0.1997,-0.6711) + -- (-0.1997,-0.6540) + --cycle + ( 0.2950,-0.6455) + .. controls ( 0.3615,-0.6477) and ( 0.3567,-0.6705) .. ( 0.3974,-0.7222) + .. controls ( 0.3592,-0.8249) and ( 0.3353,-0.7947) .. ( 0.2609,-0.7990) + -- ( 0.2438,-0.7649) + .. controls ( 0.2681,-0.7474) and ( 0.2638,-0.7424) .. ( 0.2609,-0.7137) + -- ( 0.2950,-0.6881) + .. controls ( 0.3035,-0.6916) and ( 0.3102,-0.6959) .. ( 0.3198,-0.6974) + .. controls ( 0.3496,-0.7020) and ( 0.3487,-0.6665) .. ( 0.3120,-0.6881) + --cycle + (-0.6122,-0.6460) + .. controls (-0.6202,-0.6484) and (-0.6222,-0.6534) .. (-0.6220,-0.6591) + -- (-0.6084,-0.6829) + .. controls (-0.6039,-0.6880) and (-0.6001,-0.6940) .. (-0.5958,-0.6974) + .. controls (-0.5822,-0.7078) and (-0.5979,-0.7175) .. (-0.5836,-0.7137) + -- (-0.5557,-0.7397) + .. controls (-0.5863,-0.7181) and (-0.4852,-0.7770) .. (-0.5233,-0.7812) + .. controls (-0.4643,-0.7650) and (-0.4542,-0.8172) .. (-0.4400,-0.7940) + .. controls (-0.4310,-0.7794) and (-0.4454,-0.7672) .. (-0.4569,-0.7609) + .. controls (-0.5042,-0.7356) and (-0.5468,-0.7364) .. (-0.5580,-0.6711) + .. controls (-0.5740,-0.6662) and (-0.5960,-0.6410) .. (-0.6122,-0.6460) + --cycle + (-0.2799,-0.6723) + .. controls (-0.2946,-0.6977) and (-0.2726,-0.7009) .. (-0.2645,-0.6954) + .. controls (-0.2563,-0.6899) and (-0.2508,-0.6683) .. (-0.2799,-0.6723) + --cycle + (-0.1741,-0.6796) + -- (-0.1826,-0.6881) + -- (-0.1826,-0.7052) + -- (-0.1571,-0.6796) + --cycle + ( 0.0647,-0.7393) + -- ( 0.0733,-0.7735) + -- ( 0.0902,-0.7735) + -- ( 0.0988,-0.7649) + -- ( 0.0988,-0.7478) + --cycle + ( 0.2267,-0.7564) + -- ( 0.2352,-0.7564) + -- ( 0.2352,-0.7649) + --cycle + (-0.2765,-0.7649) + -- (-0.2850,-0.7990) + -- (-0.2509,-0.7905) + -- (-0.2595,-0.7649) + --cycle + (-0.1620,-0.7999) + .. controls (-0.1665,-0.7994) and (-0.1723,-0.7994) .. (-0.1792,-0.8003) + .. controls (-0.2378,-0.8436) and (-0.2549,-0.8217) .. (-0.2658,-0.8441) + .. controls (-0.2799,-0.8733) and (-0.2098,-0.8685) .. (-0.1746,-0.8466) + .. controls (-0.1557,-0.8347) and (-0.1302,-0.8033) .. (-0.1620,-0.7999) + --cycle + (-0.0021,-0.8033) + .. controls (-0.0289,-0.7979) and (-0.0697,-0.8240) .. (-0.0817,-0.8284) + .. controls (-0.1018,-0.8361) and (-0.1245,-0.8333) .. (-0.1384,-0.8539) + .. controls (-0.1534,-0.8760) and (-0.1093,-0.8641) .. (-0.0866,-0.8639) + .. controls (-0.0704,-0.8637) and (-0.0573,-0.8695) .. (-0.0331,-0.8549) + .. controls ( 0.0004,-0.8348) and (-0.0157,-0.8559) .. ( 0.0221,-0.8587) + .. controls ( 0.0252,-0.8212) and ( 0.0141,-0.8066) .. (-0.0021,-0.8033) + --cycle + ( 0.1096,-0.8160) + .. controls ( 0.1044,-0.8138) and ( 0.0965,-0.8137) .. ( 0.0850,-0.8167) + .. controls ( 0.0624,-0.8514) and ( 0.0794,-0.8648) .. ( 0.0988,-0.8546) + .. controls ( 0.1148,-0.8462) and ( 0.1249,-0.8224) .. ( 0.1096,-0.8160) + --cycle + (-0.4386,-0.8161) + -- (-0.4386,-0.8587) + .. controls (-0.3929,-0.8508) and (-0.3929,-0.8240) .. (-0.4386,-0.8161) + --cycle + (-0.4898,-0.8246) + -- (-0.5227,-0.8312) + -- (-0.5082,-0.8563) + .. controls (-0.5034,-0.8573) and (-0.4999,-0.8586) .. (-0.4898,-0.8587) + -- (-0.4878,-0.8720) + -- (-0.4837,-0.8720) + -- (-0.4565,-0.8673) + --cycle + ; + } +} +\fi +% \end{macrocode} +% \end{TikzKey} +% \iffalse +%</hex> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/hex/tile.dtx b/macros/latex/contrib/wargame/source/hex/tile.dtx new file mode 100644 index 0000000000..76eceb27c4 --- /dev/null +++ b/macros/latex/contrib/wargame/source/hex/tile.dtx @@ -0,0 +1,25 @@ +% \iffalse +% ==================================================================== +% This is simply to create tile images. +% +%<*tile> +\documentclass{standalone} +\usepackage[terrainpic]{wargame} +\begin{document}% +\begin{tikzpicture}% + \pic{hex/terrain/% +%<beach>beach +%<city>city +%<lightwoods>light woods +%<mountains>mountains +%<rough>rough +%<sea>sea +%<swamp>swamp +%<town>town +%<village>village +%<woods>woods +};% +\end{tikzpicture} +\end{document} +%</tile> +% \fi diff --git a/macros/latex/contrib/wargame/source/hex/towns.dtx b/macros/latex/contrib/wargame/source/hex/towns.dtx new file mode 100644 index 0000000000..a73c5eed5c --- /dev/null +++ b/macros/latex/contrib/wargame/source/hex/towns.dtx @@ -0,0 +1,96 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*hex> +% \fi +% +% \subsubsection{Towns} +% \label{sec:impl:hex:town} +% +% Similar to above, we define a namespace and family for towns. First +% thing is the graphics style for towns. +% +% \begin{macrocode} +\tikzset{% + hex/town/.style={ + scale line widths, + thin, + fill=pgfstrokecolor, + color=pgfstrokecolor}, + hex/town name/.style={ + transform shape, + shape=rectangle, + above right=.1, + color=pgfstrokecolor, + font=\sffamily\normalsize} +} +% \end{macrocode} +% +% Next is the namespace for dealing with towns. +% +% \begin{macrocode} +\tikzset{% + /hex/town/.search also={/tikz},% + /hex/town/.cd, + pic/.store in=\hex@c@pic, + type/.store in=\hex@c@pic, + place/.store in=\hex@c@pos, + location/.store in=\hex@c@pos, + name/.store in=\hex@c@name, + village/.style={pic=hex/town/village}, + town/.style={pic=hex/town/town}, + city/.style={pic=hex/town/city} +} +% \end{macrocode} +% +% And some \spec{pic}tures for making the towns. +% +% \begin{macrocode} +\tikzset{% + hex/town/village/.pic={\path[fill,pic actions] circle(.1);}, + hex/town/town/.pic={\path[fill,pic actions] circle(.2);}, + hex/town/city/.pic={% + \path[fill,pic actions] circle(.25); + \path[draw,pic actions] circle(.35);} +} +% \end{macrocode} +% +% \begin{Macro}{\hex@do@town} +% +% The macro to make the towns. This uses same tricks as above. +% +% \begin{macrocode} +\def\hex@c@nameparse{% + \@ifnextchar[{\hex@c@namep@rse}{\hex@c@namep@rse[]}%] +} +\def\hex@c@namep@rse[#1]#2\endhex@c@nameparse{% + \def\hex@c@node{node[shape=rectangle,hex/town name,#1]{#2}}} + +\def\hex@do@town{% + \edef\hex@c@tmp{[ + /hex/town/.cd,% + town,% + /tikz/hex/town,% + /tikz/every hex town/.try, + \hex@town]} + \expandafter\scope\hex@c@tmp% + \ifx\hex@c@pic\empty\else% + \@ifundefined{hex@c@pos}{\let\hex@c@pos\empty}{} + \@ifundefined{hex@c@name}{\let\hex@c@name\empty}{} + \expandafter\hex@c@nameparse\hex@c@name\endhex@c@nameparse% + \ifx\hex@c@pos\empty\def\hex@c@pos{(0,0)}\fi + \hex@dbg{2}{Town: + ^^J text=\hex@c@name + ^^J pic=\hex@c@pic + ^^J place=\hex@c@pos + ^^J node=\hex@c@node + } + \filldraw \hex@c@pos pic{\hex@c@pic} \hex@c@node; + \fi% + \endscope% +} +% \end{macrocode} +% \end{Macro} +% \iffalse +%</hex> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/natoapp6c/compat/activity.dtx b/macros/latex/contrib/wargame/source/natoapp6c/compat/activity.dtx new file mode 100644 index 0000000000..c59e685b20 --- /dev/null +++ b/macros/latex/contrib/wargame/source/natoapp6c/compat/activity.dtx @@ -0,0 +1,39 @@ +%<*cmp> +\CompatSection{\spec{activity}} +\CompatTable{activity}{main}{{ + arrest/{main={arrest}}, + attempted criminal activity/{main={crime,individual}}, + automobile/{main={automobile}}, + demonstration/{main={squashed text=MASS}}, + drive by shooting/{main={rifle},lower={wheeled}}, + drug related activities/{main={squashed text=DRUG}}, + explosion/{main={explosion}}, + extortion 1/{main={text=\textdollar}}, + extortion 2/{main={text=\pounds}}, + extortion 3/{main={text=\texteuro}}, + extortion 4/{main={text=\textyen}}, + fire/{main={squashed text=FIRE}}, + graffiti/{main={graffiti}}, + improvised explosive device explosion/{main={explosion,small text=IED}}, + individual/{main={individual}}, + killing/{main={killing,individual}}, + patrolling/{main={patrolling}}, + pleasure craft/{main={sailing boat}}, + poisoning/{main={poisoning}}, + psychological operations/{main={psychological}}, + radio and television psychological operations/{main={psychological,signal}}, + riot/{main={squashed text=RIOT}}, + searching/{main={searching}}, +}} +\CompatTable{activity}{upper}{{ + assassination/{upper={text=AS}}, + execution/{upper={text=EX}}, + hijack/{upper={text=H}}, + house to house/{upper={house}}, + kidnapping/{upper={text=K}}, + murder/{upper={text=MU}}, + piracy/{upper={text=PI}}, + rape/{upper={text=RA}}, + written/{upper={text=W}}, +}} +%</cmp> diff --git a/macros/latex/contrib/wargame/source/natoapp6c/compat/air.dtx b/macros/latex/contrib/wargame/source/natoapp6c/compat/air.dtx new file mode 100644 index 0000000000..286366f81a --- /dev/null +++ b/macros/latex/contrib/wargame/source/natoapp6c/compat/air.dtx @@ -0,0 +1,87 @@ +%<*cmp> +\CompatSection{\spec{air}} +\CompatTable{air}{main}{{ + air decoy/{main={air decoy}}, + airborne command post/{main={squashed text=ACP}}, + airborne early warning/{main={squashed text=AEW}}, + anti submarine warfare/{main={squashed text=ASW}}, + anti surface warfare/{main={squashed text=ASUW}}, + attack/{main={text=A}}, + bomber/{main={text=B}}, + cargo/{main={text=C}}, + civilian airship/{main={airship}}, + civilian balloon/{main={balloon}}, + civilian fixed wing/{main={fixed wing}}, + civilian rotary wing/{main={rotary wing}}, + civilian/{main={squashed text=CIV}}, + combat search and rescue/{main={squashed text=CSAR}}, + communications/{main={squashed text=COM}}, + electronic support measures/{main={squashed text=ESM}}, + fighter/{main={text=F}}, + government/{main={squashed text=GOV}}, + jammer/{main={text=J}}, + medic/{main={[fill]medic}}, + military airship/{main={[fill]airship}}, + military balloon/{main={[fill]balloon}}, + military fixed wing/{main={[fill]fixed wing}}, + military rotary wing/{main={[fill]rotary wing}}, + military/{main={squashed text=MIL}}, + mine countermeasures/{main={squashed text=MCM}}, + passenger/{main={text=PX}}, + patrol/{main={text=P}}, + personnel recovery/{main={text=PR}}, + reconnaissance/{main={text=R}}, + search and rescue/{main={squashed text=SAR}}, + special operations forces/{main={squashed text=SOF}}, + suppression of enemy air defence/{main={squashed text=SEAD}}, + tanker/{main={text=K}}, + trainer/{main={text=T}}, + ultra light/{main={text=UL}}, + unmanned aerial vehicle/{main={[fill]unmanned}}, + utility/{main={text=U}}, + vertical short takeoff and landing/{main={text=V}}, + very important person/{main={squashed text=VIP}}, +}} +\CompatTable{air}{upper}{{ + airborne command post/{upper={squashed text=ACP}}, + airborne early warning/{upper={squashed text=AEW}}, + anti submarine warfare/{upper={squashed text=ASW}}, + anti surface warfare/{upper={squashed text=ASUW}}, + cargo/{upper={text=C}}, + combat search and rescue/{upper={squashed text=CSAR}}, + communications/{upper={squashed text=COM}}, + electronic support measures/{upper={squashed text=ESM}}, + escort/{upper={text=E}}, + government flight/{upper={squashed text=GOV}}, + intensive care/{upper={text=IC}}, + jammer/{upper={text=R}}, + medical evacuation/{upper={[fill]medic}}, + mine countermeasures/{upper={squashed text=MCM}}, + passenger plane/{upper={text=PX}}, + patrol/{upper={text=J}}, + photography/{upper={text=PH}}, + reconnaissance/{upper={text=P}}, + search and rescue/{upper={squashed text=SAR}}, + special operations forces/{upper={squashed text=SOF}}, + suppression of enemy air defence/{upper={squashed text=SEAD}}, + tanker/{upper={text=K}}, + trainer/{upper={text=T}}, + ultra light/{upper={text=UL}}, + utility/{upper={text=U}}, + very important person/{upper={squashed text=VIP}}, +}} + +\CompatTable{air}{lower}{{ + boom and drogue/{lower={squashed text=B/D}}, + boom only/{lower={text=B}}, + close range/{lower={text=CR}}, + drogue only/{lower={text=D}}, + heavy/{lower={text=H}}, + light/{lower={text=L}}, + long range/{lower={text=LR}}, + medium range/{lower={text=MR}}, + medium/{lower={text=M}}, + short range/{lower={text=SR}}, +}} +%</cmp> +% diff --git a/macros/latex/contrib/wargame/source/natoapp6c/compat/equipment.dtx b/macros/latex/contrib/wargame/source/natoapp6c/compat/equipment.dtx new file mode 100644 index 0000000000..d38cb93dbc --- /dev/null +++ b/macros/latex/contrib/wargame/source/natoapp6c/compat/equipment.dtx @@ -0,0 +1,99 @@ +%<*cmp> +\CompatSection{\spec{equipment}} +\CompatTable{equipment}{main}{{ + air defence gun/{main={gun=air defence}}, + air defence missile launcher/{main={missile launcher=air defence}}, + antennae/{main={antenna}}, + anti tank gun/{main={gun=anti tank}}, + anti tank missile launcher/{main={missile launcher=anti tank}}, + anti tank rocket launcher/{main={rocket launcher=anti tank}}, + antipersonnel land mine/{main={land mine=personnel}}, + antitank land mine/{main={land mine=tank}}, + armoured fighting vehicle command and control/{main={armoured fighting vehicle,small text=C2}}, + armoured fighting vehicle/{main={armoured fighting vehicle}}, + armoured medical personnel carrier/{main={{[save clip]armoured personnel carrier},{[scale=.7]medical}}}, + armoured personnel carrier/{main={armoured personnel carrier}}, + armoured protected recovery vehicle/{main={armoured,[scale=.7]maintenance}}, + armoured protected vehicle/{main={armoured}}, + automatic rifle/{main={rifle,type=heavy}}, + bomb/{main={squashed text=BOMB}}, + booby trap/{main={booby trap}}, + bridge mounted on utility vehicle/{main={utility vehicle,[scale=.7]bridge}}, + bridge/{main={bridge}}, + bus/{main={utility vehicle,text=B}}, + chemical biological radiological nuclear equipment/{main={chemical biological radiological nuclear}}, + computer system/{main={computer system}}, + direct fire gun/{main={gun=direct}}, + drill mounted on vehicle/{main={utility vehicle,{[scale=.6,yshift=-3]drilling}}}, + drill/{main={drilling}}, + earthmover/{main={earthmover}}, + fixed bridge/{main={bridge=fixed}}, + flame thrower/{main={flame thrower}}, + folding girder bridge/{main={bridge=folding}}, + generator set/{main={text=G}}, + grenade launcher/{main={grenade launcher}}, + heavy grenade launcher/{main={grenade launcher,[yshift=-.2]type=heavy}}, + heavy machine gun/{main={machine gun,type=heavy}}, + heavy tank/{main={tank,type=vheavy}}, + hollow deck bridge/{main={bridge=hollow}}, + howitzer/{main={howitzer}}, + improvised explosive device/{main={squashed text=IED}}, + land mine/{main={land mine}}, + laser/{main={laser}}, + light grenade launcher/{main={grenade launcher,[yshift=-.2]type=light}}, + light machine gun/{main={machine gun,type=light}}, + light tank/{main={tank,type=vlight}}, + machine gun/{main={machine gun}}, + medical evacuation armoured protected vehicle/{main={armoured,[fill]medic}}, + medical evacuation medical vehicle/{main={utility vehicle,[fill]medical}}, + medium grenade launcher/{main={grenade launcher,[yshift=-.2]type=medium}}, + medium machine gun/{main={machine gun,type=medium}}, + medium tank/{main={tank,type=vmedium}}, + mine clearing equipment/{main={mine clearing equipment}}, + mine clearing vehicle/{main={tank,mine clearing equipment}}, + mine laying equipment/{main={mine},upper={type=light}}, + mine laying vehicle/{main={utility vehicle,mine},upper={type=light}}, + missile launcher/{main={missile launcher}}, + mobile emergency physician/{main={[save clip]utility vehicle,physician}}, + mortar/{main={mortar}}, + multifunctional earthmover/{main={earthmover,text=MF}}, + multiple rocket launcher/{main={rocket launcher=multiple}}, + non lethal grenade launcher/{main={grenade launcher=non lethal}}, + non lethal weapon/{main={non lethal weapon}}, + petroleum oil and lubricants vehicle/{main={utility vehicle,[scale=.6]fuel}}, + psychological operations equipment/{main={psychological}}, + radar/{main={radar}}, + recoilless gun/{main={gun=recoilless}}, + rifle/{main={rifle}}, + semi automatic rifle/{main={rifle,type=medium}}, + semi trailer truck/{main={semi trailer truck}}, + sensor emplaced/{main={sensor},upper={jagged wave}}, + sensor/{main={sensor}}, + single rocket launcher/{main={rocket launcher=single}}, + single shot rifle/{main={rifle,type=light}}, + surface to surface missile launcher/{main={missile launcher=surface to surface}}, + tank recovery vehicle/{main={tank,[scale=.8]maintenance}}, + tank/{main={tank}}, + taser/{main={non lethal weapon,text=Z}}, + train locomotive/{main={train locomotive}}, + utility vehicle/{main={utility vehicle}}, + water cannon/{main={non lethal weapon,text=W}}, + water vehicle/{main={utility vehicle,{[yshift=-3,scale=.6]water}}}, +}} + +\CompatTable{equipment}{lower}{{ + amphibious/{below={amphibious}}, + barge/{below={riverine}}, + over snow/{below={over snow}}, + pack animal/{below={pack animal}}, + railroad/{below={railroad}}, + sled/{below={sled}}, + towed/{below={towed}}, + tracked/{below={tracked}}, + wheeled and tracked/{below={wheeled=and tracked}}, + wheeled cross country/{below={wheeled=cross country}}, + wheeled limited mobility/{below={wheeled=limited}}, + wheeled semi trailer/{below={wheeled=semi}}, +}} +%</cmp> +% diff --git a/macros/latex/contrib/wargame/source/natoapp6c/compat/installation.dtx b/macros/latex/contrib/wargame/source/natoapp6c/compat/installation.dtx new file mode 100644 index 0000000000..0686c01cb0 --- /dev/null +++ b/macros/latex/contrib/wargame/source/natoapp6c/compat/installation.dtx @@ -0,0 +1,43 @@ +%<*cmp> +\CompatSection{\spec{installation}} +\CompatTable{installation}{main}{{ + airport/{main={base},upper={air strip}}, + ammunition cache/{main={ammunition,supply}}, + black list location/{main={squashed text=BLK}}, + broadcast transmitter antenna/{main={antenna}}, + chemical biological radiological nuclear/{main={chemical biological radiological nuclear}}, + civilian telecommunications/{main={civilian telecommunications}}, + electric power/{main={electric power}}, + food distribution/{main={food,supply}}, + grey list location/{main={squashed text=GRAY}}, + mass grave site/{main={{[scale=.7,yshift=-.05]mortuary affairs},{[scale=.7,shift={(-.22,.05)}]mortuary affairs},{[scale=.7,shift={(.22,.05)}]mortuary affairs}}}, + medical treatment facility/{main={medical treatment}}, + medical/{main={medical}}, + mine/{main={quarry}}, + naval/{main={naval}}, + nuclear/{main={nuclear}}, + printed media/{main={printed media}}, + safe house/{main={squashed text=SAFE}}, + transportation/{main={transportation}}, + water treatment/{main={water,{[shift={(-.2,.-.1)}]small squashed text=PURE}}}, + water/{main={water}}, + white list location/{main={squashed text=WHT}}, +}} + +\CompatTable{installation}{upper}{{ + biological/{upper={text=B}}, + chemical/{upper={text=C}}, + coal/{upper={text=CO}}, + geothermal/{upper={text=GT}}, + hydroelectric/{upper={text=HY}}, + natural gas/{upper={text=NG}}, + nuclear energy/{upper={nuclear}}, + nuclear/{upper={text=N}}, + petroleum/{upper={fuel}}, + radio/{upper={text=R}}, + railroad/{upper={railroad}}, + telephone/{upper={text=T}}, + television/{upper={text=TV}}, + yard/{upper={squashed text=YRD}}, +}} +%</cmp> diff --git a/macros/latex/contrib/wargame/source/natoapp6c/compat/land.dtx b/macros/latex/contrib/wargame/source/natoapp6c/compat/land.dtx new file mode 100644 index 0000000000..38c3951376 --- /dev/null +++ b/macros/latex/contrib/wargame/source/natoapp6c/compat/land.dtx @@ -0,0 +1,266 @@ +%<*cmp> +\CompatSection{\spec{land}} +\CompatTable{land}{main}{{ + above corps support/{main={above corps support}}, + administrative/{main={squashed text=ADM}}, + air and naval gunfire liaison company/{main={[fill]artillery,reconnaissance,air traffic},upper={naval}}, + air assault with organic lift/{main={air assault with organic lift}}, + air defence/{main={air defence}}, + air traffic services/{main={air traffic,[fill]individual}}, + ammunition/{main={ammunition}}, + amphibious/{main={amphibious}}, + analysis electronic warfare/{main={analysis,electronic warfare wide}}, + analysis/{main={analysis}}, + anti tank anti armour/{main={anti tank anti armour}}, + armoured engineer/{main={armoured,[scale=.7]engineer}}, + armoured/{main={armoured}}, + aviation composite fixed wing and rotary wing/{main={[fill]fixed and rotary wing}}, + aviation fixed wing/{main={fixed wing}}, + aviation rotary wing/{main={rotary wing}}, + band/{main={squashed text=BAND}}, + broadcast transmitter antenna/{main={antenna}}, + chemical biological radiological nuclear defence/{main={chemical biological radiological nuclear}}, + civil affairs/{main={text=CA}}, + civilian military cooperation/{main={civilian military cooperation}}, + civilian police/{main={civilian police}}, + combat service support/{main={squashed text=CSS}}, + combat support/{main={combat support}}, + combat/{main={squashed text=CBT}}, + combined arms/{main={combined arms}}, + corps support/{main={corps support}}, + counter intelligence/{main={text=CI}}, + criminal investigation division/{main={squashed text=CID}}, + direction finding electronic warfare/{main={direction finding,electronic warfare wide}}, + diving/{main={diving}}, + dog/{main={squashed text=DOG}}, + drilling/{main={drilling}}, + electronic ordinance disposal/{main={squashed text=EOD}}, + electronic ranging/{main={electronic ranging}}, + electronic warfare/{main={text=EW}}, + engineer/{main={engineer}}, + environmental protection/{main={environmental protection}}, + field artillery observer/{main={{[clip]observer},{[scale=.7,shift={(0,-.1)},fill]artillery},reconnaissance}}, + field artillery/{main={[fill]artillery}}, + finance/{main={finance}}, + fire protection/{main={fire protection}}, + geospatial support/{main={squashed text=GEO}}, + government organization/{main={text=GO}}, + headquarters/{main={headquarters}}, + individual/{main={individual}}, + infantry/{main={infantry}}, + information operations/{main={text=IO}}, + intercept electronic warfare/{main={[fill]analysis,electronic warfare wide}}, + intercept/{main={[fill]analysis}}, + internal security force/{main={squashed text=ISF}}, + interrogation/{main={squashed text=IPW}}, + jamming electronic warfare/{main={jamming,text=EW}}, + jamming/{main={jamming}}, + joint fire support/{main={squashed text=JFS}}, + judge advocate general/{main={squashed text=JAG}}, + killing victim/{main={killing,individual}}, + killing victims/{main={killing,group}}, + labour/{main={labour}}, + laundry/{main={laundry}}, + liaison/{main={text=LO}}, + main gun system/{main={main gun}}, + maintenance/{main={maintenance=fill}}, + material/{main={squashed text=MAT}}, + medical treatment facility/{main={medical treatment}}, + medical/{main={medical}}, + meteorological/{main={squashed text=MET}}, + military intelligence/{main={text=MI}}, + military police/{main={text=MP}}, + mine/{main={mine}}, + missile/{main={land missile}}, + morale welfare and recreation/{main={squashed text=MWE}}, + mortar/{main={mortar}}, + mortuary affairs/{main={mortuary affairs}}, + motorized/{main={motorized}}, + naval/{main={naval}}, + observer/{main={observer}}, + ordnance/{main={ordnance}}, + organisation or group/{main={organisation}}, + personnel services/{main={text=PS}}, + petroleum oil and lubricants/{main={fuel}}, + pipeline/{main={pipeline}}, + postal/{main={postal}}, + psychological operations broadcast/{main={antenna,{[scale=.7,fill]psychological}}}, + psychological/{main={psychological}}, + public affairs/{main={text=PA}}, + quartermaster/{main={quartermaster}}, + radar/{main={radar}}, + radio relay:/{main={radio relay}}, + radio teletype centre/{main={radio teletype}}, + radio/{main={radio}}, + reconnaissance/{main={reconnaissance}}, + religious support/{main={squashed text=REL}}, + replacement holding unit/{main={squashed text=RHU}}, + sea air land/{main={squashed text=SEAL}}, + search electronic warfare/{main={search,electronic warfare wide}}, + search/{main={search}}, + security/{main={squashed text=SEC}}, + self propelled field artillery/{main={motorized,artillery}}, + sensor/{main={sensor}}, + shore patrol security police/{main={text=SP}}, + signal radio relay/{main={signal,radio relay}}, + signal radio teletype centre/{main={signal,radio teletype}}, + signal radio/{main={signal,radio}}, + signal tactical satellite/{main={signal,tactical satellite}}, + signal/{main={signal}}, + sniper:/{main={sniper}}, + special forces/{main={text=SF}}, + special operations forces/{main={squashed text=SOF}}, + spy:/{main={squashed text=SPY}}, + supply/{main={supply}}, + surveillance/{main={[fill]observer}}, + survey/{main={survey}}, + sustainment/{main={squashed text=SUST}}, + tactical mortar/{main={armoured,[scale=.6]mortar}}, + tactical satellite/{main={tactical satellite}}, + topographic/{main={topographic}}, + transportation/{main={transportation}}, + unmanned systems/{main={unmanned}}, + victim of an attempted crime/{main={individual,crime}}, + video imagery/{main={video imagery}}, + water purification/{main={water,{[shift={(-.2,.-.1)}]small squashed text=PURE}}}, + water/{main={water}}, +}} + +\CompatTable{land}{upper}{{ + Mil medical role 1/{upper={text=1}}, + Mil medical role 2/{upper={text=2}}, + Mil medical role 3/{upper={text=3}}, + Mil medical role 4/{upper={text=4}}, + air assault/{upper={air assault}}, + area/{upper={squashed text=AREA}}, + assassination/{upper={text=AS}}, + attack/{upper={text=A}}, + biological/{upper={text=B}}, + border/{upper={squashed text=BOR}}, + bridging/{upper={bridge}}, + chemical/{upper={text=C}}, + close protection/{upper={squashed text=CLP}}, + coerced or impressed recruit/{upper={text=C}}, + combat/{upper={squashed text=CBT}}, + command and control/{upper={text=C2}}, + communications contingency package/{upper={squashed text=CCP}}, + construction/{upper={squashed text=CONST}}, + cross cultural communication/{upper={squashed text=CCC}}, + crowd and riot control/{upper={squashed text=CRC}}, + decontamination/{upper={text=D}}, + detention/{upper={squashed text=DET}}, + direct communications/{upper={direct communications}}, + displaced persons refugees and evacuees/{upper={squashed text=DPRE}}, + diving/{upper={diving}}, + division/{upper={text=XX}}, + dog/{upper={squashed text=DOG}}, + drilling/{upper={drilling}}, + electro optical/{upper={text=EO}}, + enhanced/{upper={squashed text=ENH}}, + execution/{upper={text=EX}}, + explosive ordnance disposal/{upper={squashed text=EOD}}, + fire direction centre/{upper={squashed text=FDC}}, + force/{upper={text=F}}, + foreign fighters/{upper={text=FF}}, + forward/{upper={squashed text=FWD}}, + gang member or gang/{upper={squashed text=GANG}}, + government organisation/{upper={text=GO}}, + ground station module/{upper={squashed text=GSM}}, + hijacking/{upper={text=H}}, + kidnapping/{upper={text=K}}, + landing support/{upper={text=LS}}, + large extension node/{upper={squashed text=LEN}}, + leader or leadership/{upper={squashed text=LDR}}, + maintenance:/{upper={maintenance}}, + mine countermeasuure/{upper={squashed text=MCM}}, + missile:/{upper={land missile}}, + mobile advisor and support/{upper={mobile advisor and support}}, + mobile subscriber equipment/{upper={squashed text=MSE}}, + mobility support/{upper={text=MS}}, + movement control centre/{upper={squashed text=MCC}}, + multinational specialized unit/{upper={squashed text=MSU}}, + multinational/{upper={text=MN}}, + multiple rocket launcher/{upper={rocket launcher=multiple head}}, + murder victims/{upper={text=MU}}, + naval/{upper={naval}}, + node centre/{upper={text=NC}}, + non-governmental organization member or non-governmental/{upper={organisation}}, + nuclear:/{upper={text=N}}, + operations:/{upper={squashed text=OPS}}, + piracy:/{upper={text=PI}}, + radar:/{upper={radar}}, + radiological/{upper={squashed text=RAD}}, + rape/{upper={text=RA}}, + religious or religious organisation/{upper={squashed text=REL}}, + runway/{upper={runway}}, + search and rescue/{upper={squashed text=SAR}}, + security/{upper={squashed text=SEC}}, + sensor control module/{upper={squashed text=SEM}}, + sensor/{upper={sensor}}, + signals intelligence/{upper={signals intelligence}}, + single rocket launcher/{upper={rocket launcher=single head}}, + single shelter switch/{upper={squashed text=SSS}}, + smoke/{upper={text=S}}, + sniper/{upper={sniper}}, + sound ranging/{upper={squashed text=SDR}}, + special weapons and tactics/{upper={squashed text=SWAT}}, + survey:/{upper={survey}}, + tactical exploitation/{upper={text=TE}}, + target acquisition/{upper={text=TA}}, + targeted individual or organisation/{upper={squashed text=TGT}}, + terrorist or terrorist organisation/{upper={squashed text=TER}}, + topographic/{upper={topographic}}, + utility/{upper={text=U}}, + video imagery/{upper={video imagery}}, + willing recruit/{upper={text=W}}, +}} + +\CompatTable{land}{lower}{{ + airborne/{lower={airborne}}, + arctic/{lower={arctic}}, + battle damage repair/{lower={squashed text=BDR}}, + bicycle equipped/{lower={bicycle equipped}}, + clearing/{lower={squashed text=CLR}}, + close range/{lower={text=CR}}, + control/{lower={control}}, + decontamination/{lower={text=D}}, + demolition/{lower={squashed text=DEM}}, + dental/{lower={text=D}}, + digital/{lower={squashed text=DIG}}, + enhanced location reporting system/{lower={enhanced location reporting system}}, + equipment/{lower={text=E}}, + heavy/{lower={text=H}}, + intensive care/{lower={text=IC}}, + intermodal/{lower={intermodal}}, + laboratory/{lower={squashed text=LAB}}, + launcher/{lower={launcher}}, + light/{lower={text=L}}, + long range/{lower={text=LR}}, + medium range/{lower={text=MR}}, + mountain/{lower={mountain}}, + multi channel/{lower={text=MC}}, + optical/{lower={squashed text=OPT}}, + pack animal/{lower={pack animal}}, + patient evacuation coordination/{lower={squashed text=PEC}}, + preventative maintenance/{lower={text=PM}}, + psychological/{lower={text=P}}, + radio relay line of sight/{lower={radio relay line of sight}}, + railroad/{lower={railroad}}, + recovery maintenance/{lower={maintenance}}, + recovery unmanned systems/{lower={recovery unmanned systems}}, + rescue coordination centre/{lower={squashed text=RCC}}, + riverine/{lower={riverine}}, + short range/{lower={text=SR}}, + single channel/{lower={text=SC}}, + ski/{lower={ski}}, + strategic/{lower={squashed text=STR}}, + support/{lower={squashed text=SPT}}, + tactical/{lower={squashed text=TAC}}, + towed/{lower={towed}}, + troop/{lower={text=T}}, + vertical of short takeoff and landing/{lower={squashed text=VSTOL}}, + veterinary/{lower={text=V}}, + wheeled/{lower={wheeled}}, +}} +%</cmp> +% diff --git a/macros/latex/contrib/wargame/source/natoapp6c/compat/missile.dtx b/macros/latex/contrib/wargame/source/natoapp6c/compat/missile.dtx new file mode 100644 index 0000000000..db7ea7176d --- /dev/null +++ b/macros/latex/contrib/wargame/source/natoapp6c/compat/missile.dtx @@ -0,0 +1,14 @@ +%<*cmp> +\CompatSection{\spec{missile}} +\CompatTable{missile}{main}{{ + missile/{main={missile}}, + air/{main={missile},left={text=A}}, + anti ballistic/{main={missile},left={text=AB}}, + ballistic/{main={missile},left={text=B}}, + cruise/{main={missile},left={text=C}}, + space/{main={missile},left={text=SP}}, + sub surface/{main={missile},left={text=SU}}, + surface/{main={missile},left={text=S}}, +}} +%</cmp> +% diff --git a/macros/latex/contrib/wargame/source/natoapp6c/compat/seamine.dtx b/macros/latex/contrib/wargame/source/natoapp6c/compat/seamine.dtx new file mode 100644 index 0000000000..f4bdbd9d2f --- /dev/null +++ b/macros/latex/contrib/wargame/source/natoapp6c/compat/seamine.dtx @@ -0,0 +1,18 @@ +%<*cmp> +\CompatSection{\spec{sea mine}} +\CompatTable{sea mine}{main}{{ + free/{main={sea mine}}, + free-neutralised/{main={sea mine=neutralised}}, + bottomed/{main={sea mine},lower={bottomed}}, + bottomed-neutralised/{main={sea mine=neutralised},lower={bottomed}}, + moored/{main={sea mine},lower={moored}}, + moored-neutralised/{main={sea mine=neutralized},lower={moored}}, + floating/{main={sea mine},lower={floating}}, + floating-neutralised/{main={sea mine=neutralised},lower={floating}}, + in other position/{main={sea mine,in position}}, + in other position-neutralised/{main={sea mine=neutralised,in position}}, + rising/{main={sea mine},lower={rising}}, + rising-neutralised/{main={sea mine=neutralised},lower={rising}}, +}} +%</cmp> +% diff --git a/macros/latex/contrib/wargame/source/natoapp6c/compat/seasurface.dtx b/macros/latex/contrib/wargame/source/natoapp6c/compat/seasurface.dtx new file mode 100644 index 0000000000..2470da3a4b --- /dev/null +++ b/macros/latex/contrib/wargame/source/natoapp6c/compat/seasurface.dtx @@ -0,0 +1,131 @@ +%<*cmp> +\CompatSection{\spec{sea surface}} +\CompatTable{sea surface}{main}{{ + ammunition ship/{main={text=AE}}, + amphibious assault ship/{main={squashed text=LHA}}, + amphibious assault/{main={text=LA}}, + amphibious assualt ship helicopter/{main={squashed text=LPH}}, + amphibious command ship/{main={squashed text=LCC}}, + amphibious transport/{main={squashed text=LPD}}, + amphibious warfare ship/{main={amphibious warfare ship}}, + auxiliary flag ship/{main={squashed text=AGF}}, + auxiliary ship/{main={text=AA}}, + barge/{main={ship,[shift={(0,-.05)}]small text=YB}}, + battleship/{main={text=BB}}, + cargo/{main={ship,text=A}}, + carrier/{main={carrier}}, + civilian boat/{main={boat}}, + civilian jetski/{main={jetski}}, + civilian rigid hull inflatable boat/{main={boat,[shift={(0,-.05)}]small text=RB}}, + civilian speedboat/{main={boat,[shift={(0,-.05)}]small text=SP}}, + civilian unmanned surface water vehicle/{main={unmanned}}, + civilian/{main={squashed text=CIV}}, + combat support ship/{main={squashed text=AOE}}, + combatant/{main={combatant}}, + container ship/{main={ship,text=C}}, + convoy/{main={convoy}}, + corvette/{main={text=FS}}, + cruiser guided missile/{main={text=CG}}, + destroyer/{main={text=DD}}, + dredge/{main={ship,text=D}}, + drifter/{main={fishing vessel,text=DF}}, + ferry/{main={ship,text=F}}, + fishing vessel/{main={fishing vessel}}, + frigate/{main={text=FF}}, + harbour tug/{main={text=YT}}, + hazardous material transport ship/{main={ship,[yshift=.-.07]small text=HZ}}, + heavy lift/{main={ship,text=H}}, + hospital ship/{main={text=AH}}, + hovercraft/{main={ship,text=J}}, + intelligence collector/{main={squashed text=AGI}}, + junk/{main={ship,[yshift=-.07]small text=QJ}}, + landing craft/{main={text=LC}}, + landing ship/{main={text=LS}}, + lash carrier/{main={ship,text=L}}, + launch/{main={squashed text=YFT}}, + law enforcement vessel/{main={coast guard vessel}}, + littoral combatant ship/{main={squashed text=LCS}}, + military jetski/{main={[fill]jetski}}, + military rigid hull inflatable boat/{main={{[fill]boat},{[white,scale=.5,yshift=-1.2]small text=RB}}}, + military speedboat/{main={[fill]boat}}, + military unmanned surface water vehicle/{main={[fill]unmanned}}, + military/{main={squashed text=MIL}}, + mine countermeasure support ship/{main={squashed text=MCS}}, + mine countermeasures/{main={squashed text=MCM}}, + mine warfare vessel/{main={mine warfare vessel}}, + minehunter/{main={text=MH}}, + minelayer/{main={text=ML}}, + minesweeper drone/{main={squashed text=MSD}}, + minesweeper/{main={text=MS}}, + multi purpose amphibious assualt ship/{main={squashed text=LHD}}, + naval cargo ship/{main={text=AK}}, + navy task element/{main={navy task,squashed text=TE}}, + navy task force/{main={navy task,squashed text=TF}}, + navy task group/{main={navy task,squashed text=TG}}, + navy task organisation unit/{main={navy task}}, + navy task unit/{main={navy task,squashed text=TU}}, + non combatant/{main={non combatant}}, + non self propelled barge/{main={text=YB}}, + ocean going tug/{main={text=AT}}, + ocean research ship/{main={squashed text=AGO}}, + oiler/{main={squashed text=AOR}}, + passenger ship/{main={ship,text=P}}, + patrol craft/{main={text=PC}}, + patrol ship/{main={text=PG}}, + patrol/{main={patrol}}, + repair ship/{main={text=AR}}, + roll on roll off/{main={ship,text=E}}, + sailing boat/{main={sailing boat}}, + sea surface decoy/{main={decoy}}, + self propelled barge/{main={text=YS}}, + service craft/{main={text=YY}}, + ship/{main={ship}}, + stores ship/{main={text=AF}}, + submarine tender/{main={text=AS}}, + surface combatant/{main={surface combatant}}, + survey ship/{main={squashed text=AGS}}, + tanker/{main={ship,text=O}}, + tow/{main={ship,[yshift=-.09]small text=TW}}, + trawler/{main={fishing vessel,[yshift=-.09]small text=TR}}, + tug/{main={ship,text=T}}, +}} + +\CompatTable{sea surface}{upper}{{ + anti air warfare/{upper={squashed text=AAW}}, + anti submarine warfare/{upper={squashed text=ASW}}, + ballistic missile/{upper={text=B}}, + drone equipped/{upper={[fill]unmanned}}, + electronic warfare/{upper={text=EW}}, + escort/{upper={text=E}}, + guided missile/{upper={text=G}}, + helicopter equipped/{upper={text=H}}, + intelligence surveillance reconnaissance/{upper={squashed text=ISR}}, + medical/{upper={text=ME}}, + mine counter measures/{upper={squashed text=MCM}}, + mine warfare/{upper={text=MW}}, + missile defence/{upper={text=MD}}, + other guided missile/{upper={text=M}}, + remote multi mission vehicle/{upper={squashed text=RMV}}, + special operations force/{upper={squashed text=SOF}}, + surface warfare/{upper={squashed text=SUW}}, + torpedo/{upper={text=T}}, +}} + +\CompatTable{sea surface}{lower}{{ + air cushioned alternate/{lower={text=AC}}, + air cushioned/{lower={text=J}}, + autonomous control/{lower={squashed text=AUT}}, + dock/{lower={text=D}}, + expendable/{lower={squashed text=EXP}}, + fast/{lower={text=F}}, + heavy/{lower={text=H}}, + hydrofoil/{lower={text=K}}, + light/{lower={text=L}}, + logistics/{lower={squashed text=LOG}}, + medium/{lower={text=M}}, + nuclear powered/{lower={text=N}}, + remotely piloted/{lower={text=RP}}, + tank/{lower={text=T}}, + vehicle/{lower={text=V}}, +}} +%</cmp> diff --git a/macros/latex/contrib/wargame/source/natoapp6c/compat/space.dtx b/macros/latex/contrib/wargame/source/natoapp6c/compat/space.dtx new file mode 100644 index 0000000000..4a1a421911 --- /dev/null +++ b/macros/latex/contrib/wargame/source/natoapp6c/compat/space.dtx @@ -0,0 +1,51 @@ +%<*cmp> +\CompatSection{\spec{space}} +\CompatTable{space}{main}{{ + anti satellite weapon/{main={[fill]satellite,[scale=.6]rifle}}, + civilian astronomical satellite/{main={satellite=astronomical}}, + civilian bio satellite/{main={satellite=bio}}, + civilian capsule/{main={capsule}}, + civilian communications satellite/{main={satellite=communications}}, + civilian earth observation satellite/{main={satellite=earth observing}}, + civilian miniaturised satellite/{main={satellite=small}}, + civilian navigational satellite/{main={satellite=navigation}}, + civilian orbiter shuttle/{main={orbiter shuttle}}, + civilian satellite/{main={satellite}}, + civilian space station/{main={space station}}, + civilian tether satellite/{main={satellite=tether}}, + civilian weather satellite/{main={[yshift=-4]satellite,text=WX}}, + military astronomical satellite/{main={[fill]satellite=astronomical}}, + military bio satellite/{main={[fill]satellite=bio}}, + military capsule/{main={[fill]capsule}}, + military communications satellite/{main={[fill]satellite=communications}}, + military earth observation satellite/{main={[fill]satellite=earth observing}}, + military miniaturised satellite/{main={[fill]satellite=small}}, + military navigational satellite/{main={[fill]satellite=navigation}}, + military orbiter shuttle/{main={[fill]orbiter shuttle}}, + military satellite/{main={[fill]satellite=none}}, + military space station/{main={[fill]space station}}, + military tether satellite/{main={[fill]satellite=tether}}, + military weather satellite/{main={{[fill,yshift=-4]satellite},text=WX}}, + planet lander/{main={text=PL}}, + reconnaissance satellite/{main={satellite=reconnaissance}}, + reentry vehicle/{main={text=RV}}, + satellite/{main={squashed text=SAT}}, + space vehicle/{main={text=SV}}, +}} + +\CompatTable{space}{upper}{{ + geostationary orbit/{upper={text=GO}}, + geosynchronous orbit/{upper={squashed text=GSO}}, + high earth orbit/{upper={squashed text=HEO}}, + low earth orbit/{upper={squashed text=LEO}}, + medium earth orbit/{upper={squashed text=MEO}}, + molinya orbit/{upper={text=MO}}, +}} + +\CompatTable{space}{lower}{{ + infra red/{lower={text=IR}}, + optical/{lower={text=O}}, + radar=/{lower={text=R}}, + signals instelligence/{lower={text=SI}}, +}} +%</cmp> diff --git a/macros/latex/contrib/wargame/source/natoapp6c/compat/subsurface.dtx b/macros/latex/contrib/wargame/source/natoapp6c/compat/subsurface.dtx new file mode 100644 index 0000000000..38a867bdcd --- /dev/null +++ b/macros/latex/contrib/wargame/source/natoapp6c/compat/subsurface.dtx @@ -0,0 +1,67 @@ +%<*cmp> +\CompatSection{\spec{sub surface}} +\CompatTable{sub surface}{main}{{ + autonomous underwater vehicle/{main={[fill]unmanned}}, + bottomed sea mine decoy/{main={[fill]sea mine=top half,{[scale=.6,yshift=-6]decoy}},lower={bottomed}}, + bottomed submarine/{main={submarine},lower={bottomed}}, + civilian autonomous underwatervehicle/{main={unmanned}}, + civilian diver/{main={diving}}, + civilian seabed installation/{main={seabed installation}}, + civilian submersible/{main={submersible}}, + civilian/{main={squashed text=CIV}}, + improvised explosive device/{main={squashed text=IED}}, + military diver/{main={diving=military}}, + military seabed installation/{main={[fill]seabed installation}}, + military/{main={squashed text=MIL}}, + moored sea mine decoy/{main={[fill]sea mine=top half,{[yshift=-4,scale=.6]decoy}},lower={[yshift=-2]bottomed,moored}}, + non submarine/{main={small squashed text=NON SUB}}, + other submersible/{main={[fill]submersible}}, + sea mine decoy/{main={[fill]sea mine=top half,{[scale=.6,yshift=-6]decoy}}}, + snorkelling submarine/{main={submarine},upper={[yshift=-8]surfaced,[yshift=-2]type=vlight}}, + submarine/{main={submarine}}, + surfaced submarine/{main={submarine},lower={surfaced}}, + torpedo/{main={torpedo}}, + underwater decoy/{main={decoy},upper={[yshift=-4]bottomed}}, + underwater weapon/{main={squashed text=WPN}}, + unexploded ordnance/{main={unexploded ordnance}}, +}} + +\CompatTable{sub surface}{upper}{{ + anti submarine warfare/{upper={squashed text=ASW}}, + attack/{upper={text=A}}, + auxiliary/{upper={squashed text=AUX}}, + ballistic missile/{upper={text=B}}, + certain submarine/{upper={text=CT}}, + command and control/{upper={text=C2}}, + guided missile/{upper={text=G}}, + intelligence surveillance reconnaissance/{upper={squashed text=ISR}}, + mine countermeasures/{upper={squashed text=MCM}}, + mine warfare/{upper={text=MW}}, + other guided missile/{upper={text=M}}, + possible submarine high 3/{upper={text=P3}}, + possible submarine high 4/{upper={text=P4}}, + possible submarine low 1/{upper={text=P1}}, + possible submarine low 2/{upper={text=P2}}, + probable submarine/{upper={text=PB}}, + special operations force/{upper={squashed text=SOF}}, + surface warfare/{upper={squashed text=SUW}}, +}} + +\CompatTable{sub surface}{lower}{{ + air independent propulsion/{lower={text=AI}}, + autonomous control/{lower={squashed text=AUT}}, + diesel propulsion/{lower={text=D}}, + diesel type 1/{lower={text=D1}}, + diesel type 2/{lower={text=D2}}, + diesel type 3/{lower={text=D3}}, + expendable/{lower={squashed text=EXP}}, + nuclear propulsion/{lower={text=N}}, + nuclear type 1/{lower={text=N1}}, + nuclear type 2/{lower={text=N2}}, + nuclear type 3/{lower={text=N3}}, + nuclear type 4/{lower={text=N4}}, + nuclear type 5/{lower={text=N5}}, + nuclear type 6/{lower={text=N6}}, + remotely piloted/{lower={text=RP}}, +}} +%</cmp> diff --git a/macros/latex/contrib/wargame/source/natoapp6c/core.dtx b/macros/latex/contrib/wargame/source/natoapp6c/core.dtx new file mode 100644 index 0000000000..8a2caf322e --- /dev/null +++ b/macros/latex/contrib/wargame/source/natoapp6c/core.dtx @@ -0,0 +1,226 @@ +% \iffalse +% ==================================================================== +% \fi +% +% \subsection{The \texttt{wargame.natoapp6c} \TikZ{} library} +% +% In this section we define the code for the Tikz library. The +% library defines a number of \spec{pic} keys we can use to draw +% various parts of a marker. The markers conform to NATO App~6(c) +% specification. The implementation here is heavily inspired by the +% package \textsf{milsymb} \cite{milsymb} available at CTAN. +% +% \iffalse +%<*natoapp6c> +% \fi +% +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% \subsubsection{Debugging} +% \begin{Macro}{\natoappdbglvl,\n@to@pp@dbg} +% +% Set the debug level, and make debug message. +% +% \begin{macrocode} +\usetikzlibrary{wargame.util} +\usetikzlibrary{calc} +\usetikzlibrary{arrows.meta} +\usetikzlibrary{shapes.symbols} +\usetikzlibrary{positioning,intersections} +\newcount\natoappdbglvl\natoappdbglvl=\wargamedbglvl +\def\n@to@pp@dbg#1#2{% + \ifnum#1>\natoappdbglvl\relax\else\message{^^J#2}\fi} +% \end{macrocode} +% \end{Macro} +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% \subsubsection{Colours} +% +% \begin{Macro}{\c@friendly, +% \c@hostile, +% \c@neutral, +% \c@unknown} +% +% Define standard colours for marker affiliations. +% +% \begin{tabular}{|l|c|} +% \hline +% \rowcolor{headbg} +% {\color{headfg}\textbf{Name}} +% & {}\\ +% \hline +% \spec{friendly} & \tikz{\draw[fill=friendly] (0,0) rectangle(1,.2);}\\ +% \spec{hostile} & \tikz{\draw[fill=hostile ] (0,0) rectangle(1,.2);}\\ +% \spec{neutral} & \tikz{\draw[fill=neutral ] (0,0) rectangle(1,.2);}\\ +% \spec{unknown} & \tikz{\draw[fill=unknown ] (0,0) rectangle(1,.2);}\\ +% \hline +% \end{tabular} +% +% \begin{macrocode} +\definecolor{friendly}{RGB}{128, 224, 255} +\definecolor{hostile}{RGB}{255, 128, 128} +\definecolor{neutral}{RGB}{170, 255, 170} +\definecolor{unknown}{RGB}{255, 255, 128} +\tikzset{% + faction/.code={% + \@ifundefined{natoapp@fac}{% + }{\tikzset{fill=\natoapp@fac}}}} +% \end{macrocode} +% \end{Macro} +% +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% \subsubsection{Some dimensions} +% +% We define a number of dimensions which we will use in the +% following. They provide a rough parameterisation of the node +% shapes, but shouldn't really be changed. We have them here so that +% the code uses as few hard coded numbers as possible. +% +% The dimensions are +% \begin{itemize} +% \item Installation `hat' $x$ coordinate +% \item Installation `hat' height +% \item Activity width of boxes +% \item Height of space bar +% \item Radius of the symbol +% \end{itemize} +% +% \begin{macrocode} +\newdimen\n@to@pp@inst@x\n@to@pp@inst@x=0.2cm +\newdimen\n@to@pp@inst@h\n@to@pp@inst@h=0.15cm +\newdimen\n@to@pp@act@w\n@to@pp@act@w=0.15cm +\newdimen\n@to@pp@space@h\n@to@pp@space@h=0.1cm +\newdimen\n@to@pp@r\n@to@pp@r=0.5cm +% \end{macrocode} +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% \subsubsection{Some utilities} +% +% \begin{Macro}{\n@to@pp@isclip} +% This detects if we're in a node that is being used for clipping +% +% \begin{macrocode} +%\def\n@to@pp@cliptoken{clip} +%\def\n@to@pp@isclip{FF\fi% +% % \message{^^Jclip is \meaning\pgf@up@clip}% +% \ifx\pgf@up@clip\n@to@pp@cliptoken} +\newif\ifn@to@pp@isclip\n@to@pp@isclipfalse +% \end{macrocode} +% \end{Macro} +% +% +% \begin{Macro}{\n@to@pp@saved@fill@color,\n@to@pp@saved@stroke@color} +% +% Macros to hold saved colours. + +% \begin{macrocode} +\let\n@to@pp@saved@stroke@color\relax +\let\n@to@pp@saved@fill@color\relax +% \end{macrocode} +% \end{Macro} +% +% \begin{Macro}{\n@to@pp@stroke@to@fill,\n@to@pp@restore@fill} +% Macro to get stroke and fill colours and set the fill colour to +% the stroke colour, and to restore to the old setting. This is +% used by the frame shapes below to make sure that filled elements +% of the frame uses the same colour as the for strokes. +% +% \begin{macrocode} +\newcommand\n@to@pp@stroke@to@fill{% + % + \expandafter\let\expandafter\n@to@pp@saved@stroke@color% + \csname\string\color@pgfstrokecolor\endcsname% + % + \expandafter\let\expandafter\n@to@pp@saved@fill@color% + \csname\string\color@pgffillcolor\endcsname% + % + \expandafter\pgf@setfillcolor\n@to@pp@saved@stroke@color% + % + % \message{^^J=== Set fill to stroke color + % ^^J Old fill: \meaning\n@to@pp@saved@fill@color + % ^^J Old stroke: \meaning\n@to@pp@saved@stroke@color} +} +% \end{macrocode} +% +% +% +% \begin{macrocode} +\newcommand\n@to@pp@restore@fill{% + % \message{^^J=== Restore fill color + % ^^J Old fill: \meaning\n@to@pp@saved@fill@color + % ^^J Old stroke: \meaning\n@to@pp@saved@stroke@color} + % + \ifx\n@to@pp@saved@fill@color\relax\else% + \expandafter\pgf@setfillcolor\n@to@pp@saved@fill@color% + \fi% + \global\let\n@to@pp@saved@fill@color\relax + \global\let\n@to@pp@saved@stroke@color\relax +} +% \end{macrocode} +% +% We also make an environment, just to simplify the use +% +% \begin{macrocode} +\newenvironment{n@to@pp@stroketofill}{% + \pgfscope% + \n@to@pp@stroke@to@fill% +}{% + \n@to@pp@restore@fill% + \endpgfscope% +} +% \end{macrocode} +% \end{Macro} +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% \subsubsection{Faction names as macros} +% +% \begin{macrocode} +\def\n@to@pp@friendly{friendly} +\def\n@to@pp@hostile{hostile} +\def\n@to@pp@neutral{neutral} +\def\n@to@pp@unknown{unknown} +% \end{macrocode} +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% \subsubsection{Node shapes} +% +% Here we define bases for all commands and affiliations. These are +% defined as node shapes. This means we will render the NATO App6(c) +% symbols as nodes with embedded nodes of the relevant shape. +% +% +% +% \input{natoapp6c/frames/base.dtx} +% \input{natoapp6c/frames/friendly.dtx} +% \input{natoapp6c/frames/hostile.dtx} +% \input{natoapp6c/frames/neutral.dtx} +% \input{natoapp6c/frames/unknown.dtx} +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% +% \input{natoapp6c/echelon.dtx} +% \input{natoapp6c/text.dtx} +% \input{natoapp6c/shape.dtx} +% \input{natoapp6c/util.dtx} +% \input{natoapp6c/weaponry.dtx} +% \input{natoapp6c/symbols.dtx} +% \input{natoapp6c/list.dtx} +% \iffalse +% </natoapp6c> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/natoapp6c/echelon.dtx b/macros/latex/contrib/wargame/source/natoapp6c/echelon.dtx new file mode 100644 index 0000000000..a63be2ae47 --- /dev/null +++ b/macros/latex/contrib/wargame/source/natoapp6c/echelon.dtx @@ -0,0 +1,82 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*natoapp6c> +% \fi +% \subsubsection{Echelons} +% +% +% Dimensions +% +% \begin{macrocode} +\def\n@to@pp@e@y{.12} +\def\n@to@pp@e@yy{.24} +% \end{macrocode} +% +% Paths as macros +% +% \begin{macrocode} +\def\n@to@pp@e@d#1{($(#1*\n@to@pp@e@y,0)$) circle(0.09)} +\def\n@to@pp@e@b#1{% + ($(#1*\n@to@pp@e@y,-\n@to@pp@e@y)$) -- ($(#1*\n@to@pp@e@y,\n@to@pp@e@y)$)} +\def\n@to@pp@e@x#1{% + ($(-\n@to@pp@e@y,-\n@to@pp@e@y)+(#1*\n@to@pp@e@y,0)$)-- + ++(\n@to@pp@e@yy,\n@to@pp@e@yy) + ($(-\n@to@pp@e@y, \n@to@pp@e@y)+(#1*\n@to@pp@e@y,0)$)-- + ++(\n@to@pp@e@yy,-\n@to@pp@e@yy)} +% \end{macrocode} +% +% Pictures +% +% \begin{macrocode} +\tikzset{ + pics/natoapp6c/s/echelon/.is choice, + pics/natoapp6c/s/echelon/squad/.style={code={ + \path[draw,fill=pgfstrokecolor,pic actions] + \foreach \o in {0}{\n@to@pp@e@d{\o}};}}, + pics/natoapp6c/s/echelon/section/.style={code={ + \path[draw,fill=pgfstrokecolor,pic actions] + \foreach \o in {-1,1}{\n@to@pp@e@d{\o}};}}, + pics/natoapp6c/s/echelon/platoon/.style={code={ + \path[draw,fill=pgfstrokecolor,pic actions] + \foreach \o in {-2,0,2}{\n@to@pp@e@d{\o}};}}, + pics/natoapp6c/s/echelon/company/.style={code={ + \path[draw,pic actions] + \foreach \o in {0}{\n@to@pp@e@b{\o}};}}, + pics/natoapp6c/s/echelon/battalion/.style={code={ + \path[draw,pic actions] + \foreach \o in {-1,1}{\n@to@pp@e@b{\o}};}}, + pics/natoapp6c/s/echelon/regiment/.style={code={ + \path[draw,pic actions] + \foreach \o in {-2,0,2}{\n@to@pp@e@b{\o}};}}, + pics/natoapp6c/s/echelon/brigade/.style={code={ + \path[draw,pic actions] + \foreach \o in {0}{\n@to@pp@e@x{\o}};}}, + pics/natoapp6c/s/echelon/division/.style={code={ + \path[draw,pic actions] + \foreach \o in {-1,1}{\n@to@pp@e@x{\o}};}}, + pics/natoapp6c/s/echelon/corps/.style={code={ + \path[draw,pic actions] + \foreach \o in {-2,0,2}{\n@to@pp@e@x{\o}};}}, + pics/natoapp6c/s/echelon/army/.style={code={ + \path[draw,pic actions] + \foreach \o in {-3,-1,1,3}{\n@to@pp@e@x{\o}};}}, + pics/natoapp6c/s/echelon/army group/.style={code={ + \path[draw,pic actions] + \foreach \o in {-4,-2,0,2,4}{\n@to@pp@e@x{\o}};}}, + pics/natoapp6c/s/echelon/theatre/.style={code={ + \path[draw,pic actions] + \foreach \o in {-5,-3,-1,1,3,5}{\n@to@pp@e@x{\o}};}}, + pics/natoapp6c/s/echelon/command/.style={code={ + \path[draw,pic actions] + (-.3,-.1) -- (-.3,.1) (-.4, 0) -- (-.2, 0) + ( .3,-.1) -- ( .3,.1) ( .4, 0) -- ( .2, 0);}}, + pics/natoapp6c/s/echelon/dummy/.style={code={% + \path[draw,pic actions] (M.north west) rectangle + ($(M.north east)+(0,.1)$);}}, +} +% \end{macrocode} +% +% \iffalse +% </natoapp6c> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/natoapp6c/frames/base.dtx b/macros/latex/contrib/wargame/source/natoapp6c/frames/base.dtx new file mode 100644 index 0000000000..614bf8f95c --- /dev/null +++ b/macros/latex/contrib/wargame/source/natoapp6c/frames/base.dtx @@ -0,0 +1,70 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*natoapp6c> +% \fi +% +% First, the generic bounding box symbol for all markers. +% +% \begin{NatoAppFrame}{natoapp6c base} +% +% Place-holder symbol. This shape will form the basis of many of +% the other frame shapes. We define the relevant sizes and +% anchors. +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c base}{% + \saveddimen\radius{\pgf@x=\n@to@pp@r} + \saveddimen\liney{\pgf@x=.2cm} + \saveddimen\linex{\pgf@x=0.41cm} + \savedanchor\center{\pgf@x=0cm\pgf@y=0cm} + \savedanchor\upper{\pgf@x=0cm\pgf@y=0.35cm} + \anchor{north east}{\pgf@x=\radius\pgf@y=\radius} + \anchor{south west}{\pgf@x=-\radius\pgf@y=-\radius} + \anchor{north west}{\pgf@x=-\radius\pgf@y=\radius} + \anchor{south east}{\pgf@x=\radius\pgf@y=-\radius} + \anchor{south}{\pgf@x=0cm\pgf@y=-\radius} + \anchor{north}{\pgf@x=0cm\pgf@y=\radius} + \anchor{west}{\pgf@x=-\radius\pgf@y=0cm} + \anchor{east}{\pgf@x=\radius\pgf@y=0cm} + \anchor{center}{\center} + \anchor{upper}{\upper} + \anchor{lower}{\upper\pgf@y=-\pgf@y} + \anchor{left}{\upper\pgf@x=-\pgf@y\pgf@y=0cm} + \anchor{right}{\upper\pgf@x=\pgf@y\pgf@y=0cm} + \savedmacro\init{ + \def\octagon{% + \pgfpathmoveto{\pgfqpointpolar{0} {\radius}}% + \pgfpathlineto{\pgfqpointpolar{45} {\radius}}% + \pgfpathlineto{\pgfqpointpolar{90} {\radius}}% + \pgfpathlineto{\pgfqpointpolar{135}{\radius}}% + \pgfpathlineto{\pgfqpointpolar{180}{\radius}}% + \pgfpathlineto{\pgfqpointpolar{225}{\radius}}% + \pgfpathlineto{\pgfqpointpolar{270}{\radius}}% + \pgfpathlineto{\pgfqpointpolar{315}{\radius}}% + \pgfpathclose} + \def\topline{% + \pgfpathmoveto{\pgfqpoint{\linex}{\liney}}% + \pgfpathlineto{\pgfqpoint{-\linex}{\liney}}} + \def\bottomline{% + \pgfpathmoveto{\pgfqpoint{\linex}{-\liney}}% + \pgfpathlineto{\pgfqpoint{-\linex}{-\liney}}} + } + \backgroundpath{% + \init% + \octagon} + \behindforegroundpath{% + \init% + \octagon% + \pgfusepath{stroke}% + \topline% + \pgfusepath{stroke}% + \bottomline% + \pgfusepath{stroke}% + } +} +% \end{macrocode} +% \end{NatoAppFrame} +% \iffalse +%</natoapp6c> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/natoapp6c/frames/friendly.dtx b/macros/latex/contrib/wargame/source/natoapp6c/frames/friendly.dtx new file mode 100644 index 0000000000..d8d0c4fba7 --- /dev/null +++ b/macros/latex/contrib/wargame/source/natoapp6c/frames/friendly.dtx @@ -0,0 +1,427 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*natoapp6c> +% \fi +% \subsubsection{`Friendly' node shapes} +% +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c friendly air} +% +% Macro for friendly air shape +% +% \begin{macrocode} +\def\n@to@friendly@@ir{% + \southeast \wg@tmpa=\pgf@x\wg@tmpb=\pgf@y% + \pgfpathmoveto{\pgfqpoint{-\wg@tmpa}{\wg@tmpb}}% + \cntrl \wg@tmpb=\pgf@y% + \pgfpatharc{180}{0}{\wg@tmpa and \wg@tmpb}} +% \end{macrocode} +% +% The friendly air command. +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c friendly air}{% + \inheritsavedanchors[from=natoapp6c base] + \savedanchor\southeast{% + \pgf@x=1.1\n@to@pp@r% + \pgf@y=-\n@to@pp@r} + \savedanchor\cntrl{\pgf@x=0cm\pgf@y=2.6\n@to@pp@r} + \savedanchor\north{\pgf@x=0cm\pgf@y=1.6\n@to@pp@r} + \anchor{south east}{\southeast} + \anchor{south west}{\southeast\pgf@x=-\pgf@x} + \anchor{north east}{\southeast\wg@tmpa=\pgf@x\north\pgf@x=\wg@tmpa} + \anchor{north west}{\southeast\wg@tmpa=\pgf@x\north\pgf@x=-\wg@tmpa} + \anchor{north}{\north} + \anchor{east}{% + \north\wg@tmpb\pgf@y% + \southeast\wg@tmpc=\pgf@y\wg@tmpa=\pgf@x% + \advance\wg@tmpb-\wg@tmpc + \divide\wg@tmpb2% + \advance\wg@tmpb\wg@tmpc% + \pgf@x=\wg@tmpa% + \pgf@y=\wg@tmpb} + \anchor{west}{% + \north\wg@tmpb\pgf@y% + \southeast\wg@tmpc=\pgf@y\wg@tmpa=\pgf@x% + \advance\wg@tmpb-\wg@tmpc + \divide\wg@tmpb2% + \advance\wg@tmpb\wg@tmpc% + \pgf@x=-\wg@tmpa% + \pgf@y=\wg@tmpb} + \anchor{south}{\southeast\pgf@x=0cm} + \inheritanchor[from=natoapp6c base]{upper} + \inheritanchor[from=natoapp6c base]{lower} + \inheritanchor[from=natoapp6c base]{left} + \inheritanchor[from=natoapp6c base]{right} + \inheritanchor[from=natoapp6c base]{center} + \backgroundpath{% + \n@to@friendly@@ir% + } + \behindforegroundpath{% + \n@to@friendly@@ir% + \pgfusepath{stroke}% + } +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c friendly land} +% +% Macro for friendly land command +% +% \begin{macrocode} +\def\n@to@friendly@l@nd{% + \northeast \wg@tmpa=\pgf@x\wg@tmpb=\pgf@y% + \pgfpathmoveto{\pgfqpoint{ \wg@tmpa}{ \wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpa}{ \wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpa}{-\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{ \wg@tmpa}{-\wg@tmpb}}% + \pgfclosepath} +% \end{macrocode} +% +% The friendly land command. The most used command frame. +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c friendly land}{% + \inheritsavedanchors[from=natoapp6c base] + \savedanchor\northeast{% + \pgf@x=1.5\n@to@pp@r% + \pgf@y=\n@to@pp@r} + \anchor{north east}{\northeast} + \anchor{north west}{\northeast\pgf@x=-\pgf@x} + \anchor{south east}{\northeast\pgf@y=-\pgf@y} + \anchor{south west}{\northeast\pgf@x=-\pgf@x\pgf@y=-\pgf@y} + \anchor{north}{\northeast\pgf@x=0cm} + \anchor{south}{\northeast\pgf@x=0cm\pgf@y=-\pgf@y} + \anchor{east}{\northeast\pgf@y=0cm} + \anchor{west}{\northeast\pgf@x=-\pgf@x\pgf@y=0cm} + \inheritanchor[from=natoapp6c base]{upper} + \inheritanchor[from=natoapp6c base]{lower} + \inheritanchor[from=natoapp6c base]{left} + \inheritanchor[from=natoapp6c base]{right} + \inheritanchor[from=natoapp6c base]{center} + \backgroundpath{% + \n@to@friendly@l@nd% + } + \behindforegroundpath{% + \n@to@friendly@l@nd% + \pgfusepath{stroke}% + } +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c friendly activity} +% +% The friendly activity command. Similar to land command, but with +% boxes in the corners. +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c friendly activity}{% + \inheritsavedanchors[from=natoapp6c friendly land] + \inheritanchor[from=natoapp6c friendly land]{center} + \inheritanchor[from=natoapp6c friendly land]{inner north east} + \inheritanchor[from=natoapp6c friendly land]{inner north west} + \inheritanchor[from=natoapp6c friendly land]{inner south west} + \inheritanchor[from=natoapp6c friendly land]{inner south east} + \inheritanchor[from=natoapp6c friendly land]{north east} + \inheritanchor[from=natoapp6c friendly land]{north west} + \inheritanchor[from=natoapp6c friendly land]{south east} + \inheritanchor[from=natoapp6c friendly land]{south west} + \inheritanchor[from=natoapp6c friendly land]{north} + \inheritanchor[from=natoapp6c friendly land]{west} + \inheritanchor[from=natoapp6c friendly land]{east} + \inheritanchor[from=natoapp6c friendly land]{south} + \inheritanchor[from=natoapp6c friendly land]{upper} + \inheritanchor[from=natoapp6c friendly land]{lower} + \inheritanchor[from=natoapp6c friendly land]{left} + \inheritanchor[from=natoapp6c friendly land]{right} + \inheritanchor[from=natoapp6c friendly land]{center} + \inheritbackgroundpath[from=natoapp6c friendly land] + \behindforegroundpath{ + \begin{n@to@pp@stroketofill} + \n@to@friendly@l@nd% + \pgfusepath{stroke} + % + \northeast \wg@tmpa=\pgf@x\wg@tmpb\pgf@y% + \wg@tmpc=\wg@tmpa\advance\wg@tmpc-\n@to@pp@act@w + \wg@tmpd=\wg@tmpb\advance\wg@tmpd-\n@to@pp@act@w + % + \pgfpathmoveto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{\wg@tmpc}{\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{\wg@tmpc}{\wg@tmpd}}% + \pgfpathlineto{\pgfqpoint{\wg@tmpa}{\wg@tmpd}}% + \pgfclosepath + % + \pgfusepath{fill}% + \pgfpathmoveto{\pgfqpoint{\wg@tmpa}{-\wg@tmpd}}% + \pgfpathlineto{\pgfqpoint{\wg@tmpc}{-\wg@tmpd}}% + \pgfpathlineto{\pgfqpoint{\wg@tmpc}{-\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{\wg@tmpa}{-\wg@tmpb}}% + \pgfclosepath + \pgfusepath{fill}% + % + \pgfpathmoveto{\pgfqpoint{-\wg@tmpc}{\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpa}{\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpa}{\wg@tmpd}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpc}{\wg@tmpd}}% + \pgfclosepath + \pgfusepath{fill}% + % + \pgfpathmoveto{\pgfqpoint{-\wg@tmpc}{-\wg@tmpd}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpa}{-\wg@tmpd}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpa}{-\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpc}{-\wg@tmpb}}% + \pgfclosepath + \pgfusepath{fill}% + \end{n@to@pp@stroketofill} + } +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c friendly equipment} +% +% The friendly equipment command. A circle. +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c friendly equipment}{% + \inheritsavedanchors[from=natoapp6c base] + \savedanchor\northeast{% + \pgf@x=\n@to@pp@r% + \pgf@y=\n@to@pp@r} + \anchor{north east}{\northeast} + \anchor{north west}{\northeast\pgf@x=-\pgf@x} + \anchor{south east}{\northeast\pgf@y=-\pgf@y} + \anchor{south west}{\northeast\pgf@x=-\pgf@x\pgf@y=-\pgf@y} + \anchor{north}{\northeast\pgf@x=0cm} + \anchor{south}{\northeast\pgf@x=0cm\pgf@y=-\pgf@y} + \anchor{east}{\northeast\pgf@y=0cm} + \anchor{west}{\northeast\pgf@x=-\pgf@x\pgf@y=0cm} + \inheritanchor[from=natoapp6c base]{upper} + \inheritanchor[from=natoapp6c base]{lower} + \inheritanchor[from=natoapp6c base]{left} + \inheritanchor[from=natoapp6c base]{right} + \inheritanchor[from=natoapp6c base]{center} + \backgroundpath{% + \northeast\wg@tmpa\pgf@x% + \pgfpathcircle{\pgfqpoint{0cm}{0cm}}{\wg@tmpa} + } + \behindforegroundpath{% + \northeast\wg@tmpa\pgf@x% + \pgfpathcircle{\pgfqpoint{0cm}{0cm}}{\wg@tmpa} + \pgfusepath{stroke}% + } +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c friendly installation} +% +% The friendly installation command. Similar to the land command, but +% with a `hat' on top. +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c friendly installation}{% + \inheritsavedanchors[from=natoapp6c friendly land] + \inheritanchor[from=natoapp6c friendly land]{center} + \inheritanchor[from=natoapp6c friendly land]{inner north east} + \inheritanchor[from=natoapp6c friendly land]{inner north west} + \inheritanchor[from=natoapp6c friendly land]{inner south west} + \inheritanchor[from=natoapp6c friendly land]{inner south east} + \inheritanchor[from=natoapp6c friendly land]{north east} + \inheritanchor[from=natoapp6c friendly land]{north west} + \inheritanchor[from=natoapp6c friendly land]{south east} + \inheritanchor[from=natoapp6c friendly land]{south west} + \inheritanchor[from=natoapp6c friendly land]{north} + \inheritanchor[from=natoapp6c friendly land]{west} + \inheritanchor[from=natoapp6c friendly land]{east} + \inheritanchor[from=natoapp6c friendly land]{south} + \inheritanchor[from=natoapp6c friendly land]{upper} + \inheritanchor[from=natoapp6c friendly land]{lower} + \inheritanchor[from=natoapp6c friendly land]{left} + \inheritanchor[from=natoapp6c friendly land]{right} + \inheritanchor[from=natoapp6c friendly land]{center} + \inheritbackgroundpath[from=natoapp6c friendly land] + \behindforegroundpath{ + \begin{n@to@pp@stroketofill} + \n@to@friendly@l@nd% + \pgfusepath{stroke} + % + \northeast \wg@tmpa=\pgf@y% + \wg@tmpb=\wg@tmpa\advance\wg@tmpb\n@to@pp@inst@h% + % + \pgfpathmoveto{\pgfqpoint{ \n@to@pp@inst@x}{\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{-\n@to@pp@inst@x}{\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{-\n@to@pp@inst@x}{\wg@tmpa}}% + \pgfpathlineto{\pgfqpoint{ \n@to@pp@inst@x}{\wg@tmpa}}% + \pgfclosepath + \pgfusepath{fill}% + \end{n@to@pp@stroketofill} + } +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c friendly sea surface} +% +% The friendly sea surface command. Same as equipment command. +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c friendly sea surface}{% + \inheritsavedanchors[from=natoapp6c friendly equipment] + \inheritanchor[from=natoapp6c friendly equipment]{inner north east} + \inheritanchor[from=natoapp6c friendly equipment]{inner north west} + \inheritanchor[from=natoapp6c friendly equipment]{inner south west} + \inheritanchor[from=natoapp6c friendly equipment]{inner south east} + \inheritanchor[from=natoapp6c friendly equipment]{north east} + \inheritanchor[from=natoapp6c friendly equipment]{north west} + \inheritanchor[from=natoapp6c friendly equipment]{south east} + \inheritanchor[from=natoapp6c friendly equipment]{south west} + \inheritanchor[from=natoapp6c friendly equipment]{north} + \inheritanchor[from=natoapp6c friendly equipment]{west} + \inheritanchor[from=natoapp6c friendly equipment]{east} + \inheritanchor[from=natoapp6c friendly equipment]{south} + \inheritanchor[from=natoapp6c friendly equipment]{upper} + \inheritanchor[from=natoapp6c friendly equipment]{lower} + \inheritanchor[from=natoapp6c friendly equipment]{left} + \inheritanchor[from=natoapp6c friendly equipment]{right} + \inheritanchor[from=natoapp6c friendly equipment]{center} + \inheritbackgroundpath[from=natoapp6c friendly equipment] + \inheritbehindforegroundpath[from=natoapp6c friendly equipment] +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c friendly space} +% +% The friendly space command. Similar to air command, but with a +% bar on top. +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c friendly space}{% + \inheritsavedanchors[from=natoapp6c friendly air] + \inheritanchor[from=natoapp6c friendly air]{north east} + \inheritanchor[from=natoapp6c friendly air]{north west} + \inheritanchor[from=natoapp6c friendly air]{south east} + \inheritanchor[from=natoapp6c friendly air]{south west} + \inheritanchor[from=natoapp6c friendly air]{north} + \inheritanchor[from=natoapp6c friendly air]{west} + \inheritanchor[from=natoapp6c friendly air]{east} + \inheritanchor[from=natoapp6c friendly air]{south} + \inheritanchor[from=natoapp6c friendly air]{upper} + \inheritanchor[from=natoapp6c friendly air]{lower} + \inheritanchor[from=natoapp6c friendly air]{left} + \inheritanchor[from=natoapp6c friendly air]{right} + \inheritanchor[from=natoapp6c friendly air]{center} + \inheritbackgroundpath[from=natoapp6c friendly air] + \behindforegroundpath{% + \begin{n@to@pp@stroketofill} + \n@to@friendly@@ir% + \pgfusepath{stroke,clip}% + % + \cntrl\wg@tmpa=\pgf@y% + \north\wg@tmpb=\pgf@y + \advance\wg@tmpb-\n@to@pp@space@h + % + \pgfpathmoveto{\pgfqpoint{ \n@to@pp@r}{\wg@tmpa}}% + \pgfpathlineto{\pgfqpoint{-\n@to@pp@r}{\wg@tmpa}}% + \pgfpathlineto{\pgfqpoint{-\n@to@pp@r}{\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{ \n@to@pp@r}{\wg@tmpb}}% + \pgfclosepath% + \pgfusepath{fill}% + \end{n@to@pp@stroketofill} + } +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c friendly sub surface} +% +% Macro for friendly sub surface command +% +% \begin{macrocode} +\def\n@to@friendly@sub{% + \northeast \wg@tmpa=\pgf@x\wg@tmpb=\pgf@y% + \pgfpathmoveto{\pgfqpoint{-\wg@tmpa}{\wg@tmpb}}% + \cntrl \wg@tmpb=\pgf@y% + \pgfpatharc{180}{0}{\wg@tmpa and \wg@tmpb}} +% \end{macrocode} +% +% The friendly sub surface command. +% +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c friendly sub surface}{% + \inheritsavedanchors[from=natoapp6c base] + \savedanchor\northeast{% + \pgf@x=1.1\n@to@pp@r% + \pgf@y=\n@to@pp@r} + \savedanchor\cntrl{\pgf@x=0cm\pgf@y=-2.6\n@to@pp@r} + \savedanchor\south{\pgf@x=0cm\pgf@y=-1.6\n@to@pp@r} + \anchor{north east}{\northeast} + \anchor{north west}{\northeast\pgf@x=-\pgf@x} + \anchor{south east}{\northeast\wg@tmpa=\pgf@x\south\pgf@x=\wg@tmpa} + \anchor{south west}{\northeast\wg@tmpa=\pgf@x\south\pgf@x=-\wg@tmpa} + \anchor{south}{\south} + \anchor{east}{ + \northeast\wg@tmpb=\pgf@y\wg@tmpa=\pgf@x% + \south\wg@tmpc\pgf@y% + \advance\wg@tmpb-\wg@tmpc + \divide\wg@tmpb2% + \advance\wg@tmpb\wg@tmpc% + \pgf@x=\wg@tmpa% + \pgf@y=\wg@tmpb} + \anchor{west}{ + \northeast\wg@tmpb=\pgf@y\wg@tmpa=\pgf@x% + \south\wg@tmpc\pgf@y% + \advance\wg@tmpb-\wg@tmpc + \divide\wg@tmpb2% + \advance\wg@tmpb\wg@tmpc% + \pgf@x=-\wg@tmpa% + \pgf@y=\wg@tmpb} + \anchor{north}{\northeast\pgf@x=0cm} + \inheritanchor[from=natoapp6c base]{upper} + \inheritanchor[from=natoapp6c base]{lower} + \inheritanchor[from=natoapp6c base]{left} + \inheritanchor[from=natoapp6c base]{right} + \inheritanchor[from=natoapp6c base]{center} + \backgroundpath{% + \n@to@friendly@sub% + } + \behindforegroundpath{% + \n@to@friendly@sub% + \pgfusepath{stroke}% + } +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +%</natoapp6c> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/natoapp6c/frames/hostile.dtx b/macros/latex/contrib/wargame/source/natoapp6c/frames/hostile.dtx new file mode 100644 index 0000000000..c3df3f6525 --- /dev/null +++ b/macros/latex/contrib/wargame/source/natoapp6c/frames/hostile.dtx @@ -0,0 +1,453 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*natoapp6c> +% \fi +% \subsubsection{`Hostile' node shapes} +% +% +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c hostile air} +% +% The hostile air command +% +% +% Macro for hostile air shape +% +% +% \begin{macrocode} +\def\n@to@hostile@@ir{% + \southeast \wg@tmpa=\pgf@x\wg@tmpb=\pgf@y% + \cntrl \wg@tmpc=\pgf@y% + \north \wg@tmpd=\pgf@y% + \pgfpathmoveto{\pgfqpoint{-\wg@tmpa}{\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpa}{\wg@tmpc}}% + \pgfpathlineto{\pgfqpoint{ 0cm}{\wg@tmpd}}% + \pgfpathlineto{\pgfqpoint{\wg@tmpa}{\wg@tmpc}}% + \pgfpathlineto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}% +} +% \end{macrocode} +% +% +% The hostile air command. +% +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c hostile air}{% + \inheritsavedanchors[from=natoapp6c base] + \savedanchor\southeast{% + \pgf@x=\n@to@pp@r% + \pgf@y=-\n@to@pp@r} + \savedanchor\cntrl{% + \pgf@x=\n@to@pp@r% + \pgf@y=0.414\n@to@pp@r% (sqrt(2)-1) + } + \savedanchor\north{\pgf@x=0cm\pgf@y=1.414\n@to@pp@r} + \anchor{south east}{\southeast} + \anchor{south west}{\southeast\pgf@x=-\pgf@x} + \anchor{north east}{\southeast\wg@tmpa=\pgf@x\north\pgf@x=\wg@tmpa} + \anchor{north west}{\southeast\wg@tmpa=\pgf@x\north\pgf@x=-\wg@tmpa} + \anchor{north}{\north} + \anchor{east}{% + \north\wg@tmpb\pgf@y% + \southeast\wg@tmpc=\pgf@y\wg@tmpa=\pgf@x% + \advance\wg@tmpb-\wg@tmpc + \divide\wg@tmpb2% + \advance\wg@tmpb\wg@tmpc% + \pgf@x=\wg@tmpa% + \pgf@y=\wg@tmpb} + \anchor{west}{% + \north\wg@tmpb\pgf@y% + \southeast\wg@tmpc=\pgf@y\wg@tmpa=\pgf@x% + \advance\wg@tmpb-\wg@tmpc + \divide\wg@tmpb2% + \advance\wg@tmpb\wg@tmpc% + \pgf@x=-\wg@tmpa% + \pgf@y=\wg@tmpb} + \anchor{south}{\southeast\pgf@x=0cm} + \inheritanchor[from=natoapp6c base]{upper} + \inheritanchor[from=natoapp6c base]{lower} + \inheritanchor[from=natoapp6c base]{left} + \inheritanchor[from=natoapp6c base]{right} + \inheritanchor[from=natoapp6c base]{center} + \backgroundpath{% + \n@to@hostile@@ir% + } + \behindforegroundpath{% + \n@to@hostile@@ir% + \pgfusepath{stroke}% + } +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c hostile land} +% +% Macro for hostile land command +% +% \begin{macrocode} +\def\n@to@hostile@l@nd{% + \northeast \wg@tmpa=\pgf@x\wg@tmpb=\pgf@y% + \pgfpathmoveto{\pgfqpoint{ \wg@tmpa}{ 0cm}}% + \pgfpathlineto{\pgfqpoint{ 0cm}{ \wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpa}{ 0cm}}% + \pgfpathlineto{\pgfqpoint{ 0cm}{-\wg@tmpb}}% + \pgfclosepath} +% \end{macrocode} +% +% The hostile land command. +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c hostile land}{% + \inheritsavedanchors[from=natoapp6c base] + \savedanchor\northeast{% + \pgf@x=1.414\n@to@pp@r% + \pgf@y=1.414\n@to@pp@r} + \anchor{north east}{\northeast} + \anchor{north west}{\northeast\pgf@x=-\pgf@x} + \anchor{south east}{\northeast\pgf@y=-\pgf@y} + \anchor{south west}{\northeast\pgf@x=-\pgf@x\pgf@y=-\pgf@y} + \anchor{north}{\northeast\pgf@x=0cm} + \anchor{south}{\northeast\pgf@x=0cm\pgf@y=-\pgf@y} + \anchor{east}{\northeast\pgf@y=0cm} + \anchor{west}{\northeast\pgf@x=-\pgf@x\pgf@y=0cm} + \inheritanchor[from=natoapp6c base]{upper} + \inheritanchor[from=natoapp6c base]{lower} + \inheritanchor[from=natoapp6c base]{left} + \inheritanchor[from=natoapp6c base]{right} + \inheritanchor[from=natoapp6c base]{center} + \backgroundpath{% + \n@to@hostile@l@nd% + } + \behindforegroundpath{% + \n@to@hostile@l@nd% + \pgfusepath{stroke}% + } +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c hostile activity} +% +% The hostile activity command. Similar to land command, but with +% boxes in the corners. +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c hostile activity}{% + \inheritsavedanchors[from=natoapp6c hostile land] + \inheritanchor[from=natoapp6c hostile land]{center} + \inheritanchor[from=natoapp6c hostile land]{inner north east} + \inheritanchor[from=natoapp6c hostile land]{inner north west} + \inheritanchor[from=natoapp6c hostile land]{inner south west} + \inheritanchor[from=natoapp6c hostile land]{inner south east} + \inheritanchor[from=natoapp6c hostile land]{north east} + \inheritanchor[from=natoapp6c hostile land]{north west} + \inheritanchor[from=natoapp6c hostile land]{south east} + \inheritanchor[from=natoapp6c hostile land]{south west} + \inheritanchor[from=natoapp6c hostile land]{north} + \inheritanchor[from=natoapp6c hostile land]{west} + \inheritanchor[from=natoapp6c hostile land]{east} + \inheritanchor[from=natoapp6c hostile land]{south} + \inheritanchor[from=natoapp6c hostile land]{upper} + \inheritanchor[from=natoapp6c hostile land]{lower} + \inheritanchor[from=natoapp6c hostile land]{left} + \inheritanchor[from=natoapp6c hostile land]{right} + \inheritanchor[from=natoapp6c hostile land]{center} + \inheritbackgroundpath[from=natoapp6c hostile land] + \behindforegroundpath{ + \begin{n@to@pp@stroketofill} + \n@to@hostile@l@nd% + \pgfusepath{stroke} + % + \northeast \wg@tmpb=\pgf@y% + \wg@tmpa=0.707\n@to@pp@act@w + \wg@tmpc=\wg@tmpb\advance\wg@tmpc-1.414\n@to@pp@act@w + \wg@tmpd=\wg@tmpb\advance\wg@tmpd-\wg@tmpa + % + \pgfpathmoveto{\pgfqpoint{ \wg@tmpa}{\wg@tmpd}}% + \pgfpathlineto{\pgfqpoint{ 0cm}{\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpa}{\wg@tmpd}}% + \pgfpathlineto{\pgfqpoint{ 0cm}{\wg@tmpc}}% + \pgfclosepath + \pgfusepath{fill}% + % + \pgfpathmoveto{\pgfqpoint{-\wg@tmpc}{0cm}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpd}{\wg@tmpa}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpb}{0cm}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpd}{-\wg@tmpa}}% + \pgfclosepath + \pgfusepath{fill}% + % + \pgfpathmoveto{\pgfqpoint{ \wg@tmpa}{-\wg@tmpd}}% + \pgfpathlineto{\pgfqpoint{ 0cm}{-\wg@tmpc}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpa}{-\wg@tmpd}}% + \pgfpathlineto{\pgfqpoint{ 0cm}{-\wg@tmpb}}% + \pgfclosepath + \pgfusepath{fill}% + % + \pgfpathmoveto{\pgfqpoint{\wg@tmpb}{0cm}}% + \pgfpathlineto{\pgfqpoint{\wg@tmpd}{\wg@tmpa}}% + \pgfpathlineto{\pgfqpoint{\wg@tmpc}{0cm}}% + \pgfpathlineto{\pgfqpoint{\wg@tmpd}{-\wg@tmpa}}% + \pgfclosepath + \pgfusepath{fill}% + \end{n@to@pp@stroketofill} + } +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c hostile equipment} +% +% The hostile equipment command. Same as land command. +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c hostile equipment}{% + \inheritsavedanchors[from=natoapp6c hostile land] + \inheritanchor[from=natoapp6c hostile land]{inner north east} + \inheritanchor[from=natoapp6c hostile land]{inner north west} + \inheritanchor[from=natoapp6c hostile land]{inner south west} + \inheritanchor[from=natoapp6c hostile land]{inner south east} + \inheritanchor[from=natoapp6c hostile land]{north east} + \inheritanchor[from=natoapp6c hostile land]{north west} + \inheritanchor[from=natoapp6c hostile land]{south east} + \inheritanchor[from=natoapp6c hostile land]{south west} + \inheritanchor[from=natoapp6c hostile land]{north} + \inheritanchor[from=natoapp6c hostile land]{west} + \inheritanchor[from=natoapp6c hostile land]{east} + \inheritanchor[from=natoapp6c hostile land]{south} + \inheritanchor[from=natoapp6c hostile land]{upper} + \inheritanchor[from=natoapp6c hostile land]{lower} + \inheritanchor[from=natoapp6c hostile land]{left} + \inheritanchor[from=natoapp6c hostile land]{right} + \inheritanchor[from=natoapp6c hostile land]{center} + \inheritbackgroundpath[from=natoapp6c hostile land] + \inheritbehindforegroundpath[from=natoapp6c hostile land] +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c hostile installation} +% +% The hostile installation command. Similar to land command, but +% with a `hat' on top. +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c hostile installation}{% + \inheritsavedanchors[from=natoapp6c hostile land] + \inheritanchor[from=natoapp6c hostile land]{center} + \inheritanchor[from=natoapp6c hostile land]{inner north east} + \inheritanchor[from=natoapp6c hostile land]{inner north west} + \inheritanchor[from=natoapp6c hostile land]{inner south west} + \inheritanchor[from=natoapp6c hostile land]{inner south east} + \inheritanchor[from=natoapp6c hostile land]{north east} + \inheritanchor[from=natoapp6c hostile land]{north west} + \inheritanchor[from=natoapp6c hostile land]{south east} + \inheritanchor[from=natoapp6c hostile land]{south west} + \inheritanchor[from=natoapp6c hostile land]{north} + \inheritanchor[from=natoapp6c hostile land]{west} + \inheritanchor[from=natoapp6c hostile land]{east} + \inheritanchor[from=natoapp6c hostile land]{south} + \inheritanchor[from=natoapp6c hostile land]{upper} + \inheritanchor[from=natoapp6c hostile land]{lower} + \inheritanchor[from=natoapp6c hostile land]{left} + \inheritanchor[from=natoapp6c hostile land]{right} + \inheritanchor[from=natoapp6c hostile land]{center} + \inheritbackgroundpath[from=natoapp6c hostile land] + \behindforegroundpath{ + \begin{n@to@pp@stroketofill} + \n@to@hostile@l@nd% + \pgfusepath{stroke} + % + \northeast \wg@tmpa=\pgf@x\wg@tmpb\pgf@y% + \wg@tmpc=\wg@tmpb + \advance\wg@tmpc\n@to@pp@inst@h% + \advance\wg@tmpc-0.05cm% + % + \pgfpathmoveto{\pgfqpoint{ \wg@tmpa}{0cm}} + \pgfpathlineto{\pgfqpoint{ \wg@tmpa}{\wg@tmpc}} + \pgfpathlineto{\pgfqpoint{-\wg@tmpa}{\wg@tmpc}} + \pgfpathlineto{\pgfqpoint{-\wg@tmpa}{0cm}} + \pgfpathlineto{\pgfqpoint{ 0cm}{\wg@tmpb}} + \pgfclosepath% + \pgfusepath{clip} + % + \wg@tmpd=\wg@tmpb% + \advance\wg@tmpd-\n@to@pp@inst@h% + % + \pgfpathmoveto{\pgfqpoint{ \n@to@pp@inst@x}{\wg@tmpc}}% + \pgfpathlineto{\pgfqpoint{-\n@to@pp@inst@x}{\wg@tmpc}}% + \pgfpathlineto{\pgfqpoint{-\n@to@pp@inst@x}{\wg@tmpd}}% + \pgfpathlineto{\pgfqpoint{ \n@to@pp@inst@x}{\wg@tmpd}}% + \pgfclosepath + \pgfusepath{fill}% + \end{n@to@pp@stroketofill} + } +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c hostile sea surface} +% +% The hostile sea surface command. Same as land command +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c hostile sea surface}{% + \inheritsavedanchors[from=natoapp6c hostile equipment] + \inheritanchor[from=natoapp6c hostile equipment]{inner north east} + \inheritanchor[from=natoapp6c hostile equipment]{inner north west} + \inheritanchor[from=natoapp6c hostile equipment]{inner south west} + \inheritanchor[from=natoapp6c hostile equipment]{inner south east} + \inheritanchor[from=natoapp6c hostile equipment]{north east} + \inheritanchor[from=natoapp6c hostile equipment]{north west} + \inheritanchor[from=natoapp6c hostile equipment]{south east} + \inheritanchor[from=natoapp6c hostile equipment]{south west} + \inheritanchor[from=natoapp6c hostile equipment]{north} + \inheritanchor[from=natoapp6c hostile equipment]{west} + \inheritanchor[from=natoapp6c hostile equipment]{east} + \inheritanchor[from=natoapp6c hostile equipment]{south} + \inheritanchor[from=natoapp6c hostile equipment]{upper} + \inheritanchor[from=natoapp6c hostile equipment]{lower} + \inheritanchor[from=natoapp6c hostile equipment]{left} + \inheritanchor[from=natoapp6c hostile equipment]{right} + \inheritanchor[from=natoapp6c hostile equipment]{center} + \inheritbackgroundpath[from=natoapp6c hostile equipment] + \inheritbehindforegroundpath[from=natoapp6c hostile equipment] +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c hostile space} +% +% The hostile space command. Similar to air command, but with bar on +% top. +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c hostile space}{% + \inheritsavedanchors[from=natoapp6c hostile air] + \inheritanchor[from=natoapp6c hostile air]{north east} + \inheritanchor[from=natoapp6c hostile air]{north west} + \inheritanchor[from=natoapp6c hostile air]{south east} + \inheritanchor[from=natoapp6c hostile air]{south west} + \inheritanchor[from=natoapp6c hostile air]{north} + \inheritanchor[from=natoapp6c hostile air]{west} + \inheritanchor[from=natoapp6c hostile air]{east} + \inheritanchor[from=natoapp6c hostile air]{south} + \inheritanchor[from=natoapp6c hostile air]{upper} + \inheritanchor[from=natoapp6c hostile air]{lower} + \inheritanchor[from=natoapp6c hostile air]{left} + \inheritanchor[from=natoapp6c hostile air]{right} + \inheritanchor[from=natoapp6c hostile air]{center} + \inheritbackgroundpath[from=natoapp6c hostile air] + \behindforegroundpath{% + \begin{n@to@pp@stroketofill} + \n@to@hostile@@ir% + \pgfusepath{stroke,clip}% + % + \north\wg@tmpa=\pgf@y\wg@tmpb=\pgf@y + \advance\wg@tmpb-\n@to@pp@space@h + % + \pgfpathmoveto{\pgfqpoint{ \n@to@pp@r}{\wg@tmpa}}% + \pgfpathlineto{\pgfqpoint{-\n@to@pp@r}{\wg@tmpa}}% + \pgfpathlineto{\pgfqpoint{-\n@to@pp@r}{\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{ \n@to@pp@r}{\wg@tmpb}}% + \pgfclosepath% + \pgfusepath{fill}% + \end{n@to@pp@stroketofill} + } +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c hostile sub surface} +% +% Macro for hostile sub surface command +% +% \begin{macrocode} +\def\n@to@hostile@sub{% + \northeast \wg@tmpa=\pgf@x\wg@tmpb=\pgf@y% + \cntrl \wg@tmpc=\pgf@y% + \south \wg@tmpd=\pgf@y% + \pgfpathmoveto{\pgfqpoint{-\wg@tmpa}{\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpa}{\wg@tmpc}}% + \pgfpathlineto{\pgfqpoint{ 0cm}{\wg@tmpd}}% + \pgfpathlineto{\pgfqpoint{\wg@tmpa}{\wg@tmpc}}% + \pgfpathlineto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}% +} +% \end{macrocode} +% +% The hostile sub surface command +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c hostile sub surface}{% + \inheritsavedanchors[from=natoapp6c base] + \savedanchor\northeast{% + \pgf@x=\n@to@pp@r% + \pgf@y=\n@to@pp@r} + \savedanchor\cntrl{\pgf@x=\n@to@pp@r\pgf@y=-0.414\n@to@pp@r} + \savedanchor\south{\pgf@x=0cm\pgf@y=-1.414\n@to@pp@r} + \anchor{north east}{\northeast} + \anchor{north west}{\northeast\pgf@x=-\pgf@x} + \anchor{south east}{\northeast\wg@tmpa=\pgf@x\south\pgf@x=\wg@tmpa} + \anchor{south west}{\northeast\wg@tmpa=\pgf@x\south\pgf@x=-\wg@tmpa} + \anchor{south}{\south} + \anchor{east}{ + \northeast\wg@tmpb=\pgf@y\wg@tmpa=\pgf@x% + \south\wg@tmpc\pgf@y% + \advance\wg@tmpb-\wg@tmpc + \divide\wg@tmpb2% + \advance\wg@tmpb\wg@tmpc% + \pgf@x=\wg@tmpa% + \pgf@y=\wg@tmpb} + \anchor{west}{ + \northeast\wg@tmpb=\pgf@y\wg@tmpa=\pgf@x% + \south\wg@tmpc\pgf@y% + \advance\wg@tmpb-\wg@tmpc + \divide\wg@tmpb2% + \advance\wg@tmpb\wg@tmpc% + \pgf@x=-\wg@tmpa% + \pgf@y=\wg@tmpb} + \anchor{north}{\northeast\pgf@x=0cm} + \inheritanchor[from=natoapp6c base]{upper} + \inheritanchor[from=natoapp6c base]{lower} + \inheritanchor[from=natoapp6c base]{left} + \inheritanchor[from=natoapp6c base]{right} + \inheritanchor[from=natoapp6c base]{center} + \backgroundpath{% + \n@to@hostile@sub% + } + \behindforegroundpath{% + \n@to@hostile@sub% + \pgfusepath{stroke}% + } +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +%</natoapp6c> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/natoapp6c/frames/neutral.dtx b/macros/latex/contrib/wargame/source/natoapp6c/frames/neutral.dtx new file mode 100644 index 0000000000..b0b18780a9 --- /dev/null +++ b/macros/latex/contrib/wargame/source/natoapp6c/frames/neutral.dtx @@ -0,0 +1,405 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*natoapp6c> +% \fi +% \subsubsection{`Neutral' node shapes} +% +% +% Macro for neutral shapes +% +% \begin{macrocode} +\def\n@to@pp@neutr@l@init{% + \northeast\wg@tmpa=\pgf@x\wg@tmpb=\pgf@y% + \def\n@to@pp@neutr@l@left {\pgflineto{\pgfqpoint{-\wg@tmpa}{-\wg@tmpb}}}% + \def\n@to@pp@neutr@l@right {\pgflineto{\pgfqpoint{ \wg@tmpa}{ \wg@tmpb}}}% + \def\n@to@pp@neutr@l@top {\pgflineto{\pgfqpoint{-\wg@tmpa}{ \wg@tmpb}}}% + \def\n@to@pp@neutr@l@bottom{\pgflineto{\pgfqpoint{ \wg@tmpa}{-\wg@tmpb}}}% + \def\n@to@pp@neutr@l@nw {\pgfmoveto{\pgfqpoint{-\wg@tmpa}{ \wg@tmpb}}}% + \def\n@to@pp@neutr@l@ne {\pgfmoveto{\pgfqpoint{ \wg@tmpa}{ \wg@tmpb}}}% + \def\n@to@pp@neutr@l@se {\pgfmoveto{\pgfqpoint{ \wg@tmpa}{-\wg@tmpb}}}% + \def\n@to@pp@neutr@l@sw {\pgfmoveto{\pgfqpoint{-\wg@tmpa}{-\wg@tmpb}}}% +} +% \end{macrocode} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c neutral air} +% +% The neutral air command +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c neutral air}{% + \inheritsavedanchors[from=natoapp6c base] + \savedanchor\northeast{\pgf@x=\n@to@pp@r\pgf@y=\n@to@pp@r} + \anchor{north east}{\northeast} + \anchor{north west}{\northeast\pgf@x=-\pgf@x} + \anchor{south east}{\northeast\pgf@y=-\pgf@y} + \anchor{south west}{\northeast\pgf@x=-\pgf@x\pgf@y=-\pgf@y} + \anchor{north}{\northeast\pgf@x=0cm} + \anchor{east}{\northeast\pgf@y=0cm} + \anchor{west}{\northeast\pgf@x=-\pgf@x\pgf@y=0cm} + \anchor{south}{\northeast\pgf@x=0cm\pgf@y=-\pgf@y} + \inheritanchor[from=natoapp6c base]{upper} + \inheritanchor[from=natoapp6c base]{lower} + \inheritanchor[from=natoapp6c base]{left} + \inheritanchor[from=natoapp6c base]{right} + \inheritanchor[from=natoapp6c base]{center} + \backgroundpath{% + \n@to@pp@neutr@l@init% + \n@to@pp@neutr@l@se + \n@to@pp@neutr@l@right% + \n@to@pp@neutr@l@top% + \n@to@pp@neutr@l@left% + } + \behindforegroundpath{% + \n@to@pp@neutr@l@init% + \n@to@pp@neutr@l@se + \n@to@pp@neutr@l@right% + \n@to@pp@neutr@l@top% + \n@to@pp@neutr@l@left% + \pgfusepath{stroke}% + } +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c neutral land} +% +% The neutral land command +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c neutral land}{% + \inheritsavedanchors[from=natoapp6c neutral air] + \inheritanchor[from=natoapp6c neutral air]{north east} + \inheritanchor[from=natoapp6c neutral air]{north west} + \inheritanchor[from=natoapp6c neutral air]{south east} + \inheritanchor[from=natoapp6c neutral air]{south west} + \inheritanchor[from=natoapp6c neutral air]{north} + \inheritanchor[from=natoapp6c neutral air]{west} + \inheritanchor[from=natoapp6c neutral air]{east} + \inheritanchor[from=natoapp6c neutral air]{south} + \inheritanchor[from=natoapp6c neutral air]{upper} + \inheritanchor[from=natoapp6c neutral air]{lower} + \inheritanchor[from=natoapp6c neutral air]{left} + \inheritanchor[from=natoapp6c neutral air]{right} + \inheritanchor[from=natoapp6c neutral air]{center} + \backgroundpath{% + \n@to@pp@neutr@l@init% + \n@to@pp@neutr@l@ne + \n@to@pp@neutr@l@top% + \n@to@pp@neutr@l@left% + \n@to@pp@neutr@l@bottom% + \pgfclosepath + } + \behindforegroundpath{% + \n@to@pp@neutr@l@init% + \n@to@pp@neutr@l@ne + \n@to@pp@neutr@l@top% + \n@to@pp@neutr@l@left% + \n@to@pp@neutr@l@bottom% + \pgfclosepath + \pgfusepath{stroke}% + } +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c neutral activity} +% +% The neutral activity command. Similar to land command but with +% boxes added in the corners. +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c neutral activity}{% + \inheritsavedanchors[from=natoapp6c neutral land] + \inheritanchor[from=natoapp6c neutral land]{center} + \inheritanchor[from=natoapp6c neutral land]{inner north east} + \inheritanchor[from=natoapp6c neutral land]{inner north west} + \inheritanchor[from=natoapp6c neutral land]{inner south west} + \inheritanchor[from=natoapp6c neutral land]{inner south east} + \inheritanchor[from=natoapp6c neutral land]{north east} + \inheritanchor[from=natoapp6c neutral land]{north west} + \inheritanchor[from=natoapp6c neutral land]{south east} + \inheritanchor[from=natoapp6c neutral land]{south west} + \inheritanchor[from=natoapp6c neutral land]{north} + \inheritanchor[from=natoapp6c neutral land]{west} + \inheritanchor[from=natoapp6c neutral land]{east} + \inheritanchor[from=natoapp6c neutral land]{south} + \inheritanchor[from=natoapp6c neutral land]{upper} + \inheritanchor[from=natoapp6c neutral land]{lower} + \inheritanchor[from=natoapp6c neutral land]{left} + \inheritanchor[from=natoapp6c neutral land]{right} + \inheritanchor[from=natoapp6c neutral land]{center} + \inheritbackgroundpath[from=natoapp6c neutral land] + \behindforegroundpath{ + \begin{n@to@pp@stroketofill} + \n@to@pp@neutr@l@init% + \n@to@pp@neutr@l@ne + \n@to@pp@neutr@l@top% + \n@to@pp@neutr@l@left% + \n@to@pp@neutr@l@bottom% + \pgfclosepath + \pgfusepath{stroke} + % + \northeast \wg@tmpa=\pgf@x\wg@tmpb\pgf@y% + \wg@tmpc=\wg@tmpa\advance\wg@tmpc-\n@to@pp@act@w + \wg@tmpd=\wg@tmpb\advance\wg@tmpd-\n@to@pp@act@w + % + \pgfpathmoveto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{\wg@tmpc}{\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{\wg@tmpc}{\wg@tmpd}}% + \pgfpathlineto{\pgfqpoint{\wg@tmpa}{\wg@tmpd}}% + \pgfclosepath + \pgfusepath{fill}% + % + \pgfpathmoveto{\pgfqpoint{\wg@tmpa}{-\wg@tmpd}}% + \pgfpathlineto{\pgfqpoint{\wg@tmpc}{-\wg@tmpd}}% + \pgfpathlineto{\pgfqpoint{\wg@tmpc}{-\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{\wg@tmpa}{-\wg@tmpb}}% + \pgfclosepath + \pgfusepath{fill}% + % + \pgfpathmoveto{\pgfqpoint{-\wg@tmpc}{\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpa}{\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpa}{\wg@tmpd}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpc}{\wg@tmpd}}% + \pgfclosepath + \pgfusepath{fill}% + % + \pgfpathmoveto{\pgfqpoint{-\wg@tmpc}{-\wg@tmpd}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpa}{-\wg@tmpd}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpa}{-\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpc}{-\wg@tmpb}}% + \pgfclosepath + \pgfusepath{fill}% + \end{n@to@pp@stroketofill} + } +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c neutral equipment} +% +% The neutral equipment command. Same as land command +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c neutral equipment}{% + \inheritsavedanchors[from=natoapp6c neutral land] + \inheritanchor[from=natoapp6c neutral land]{center} + \inheritanchor[from=natoapp6c neutral land]{inner north east} + \inheritanchor[from=natoapp6c neutral land]{inner north west} + \inheritanchor[from=natoapp6c neutral land]{inner south west} + \inheritanchor[from=natoapp6c neutral land]{inner south east} + \inheritanchor[from=natoapp6c neutral land]{north east} + \inheritanchor[from=natoapp6c neutral land]{north west} + \inheritanchor[from=natoapp6c neutral land]{south east} + \inheritanchor[from=natoapp6c neutral land]{south west} + \inheritanchor[from=natoapp6c neutral land]{north} + \inheritanchor[from=natoapp6c neutral land]{west} + \inheritanchor[from=natoapp6c neutral land]{east} + \inheritanchor[from=natoapp6c neutral land]{south} + \inheritanchor[from=natoapp6c neutral land]{upper} + \inheritanchor[from=natoapp6c neutral land]{lower} + \inheritanchor[from=natoapp6c neutral land]{left} + \inheritanchor[from=natoapp6c neutral land]{right} + \inheritanchor[from=natoapp6c neutral land]{center} + \inheritbackgroundpath[from=natoapp6c neutral land] + \inheritbehindbackgroundpath[from=natoapp6c neutral land] +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c neutral installation} +% +% The neutral installation command. Similar to land command but +% with a `hat' on top. +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c neutral installation}{% + \inheritsavedanchors[from=natoapp6c neutral land] + \inheritanchor[from=natoapp6c neutral land]{center} + \inheritanchor[from=natoapp6c neutral land]{inner north east} + \inheritanchor[from=natoapp6c neutral land]{inner north west} + \inheritanchor[from=natoapp6c neutral land]{inner south west} + \inheritanchor[from=natoapp6c neutral land]{inner south east} + \inheritanchor[from=natoapp6c neutral land]{north east} + \inheritanchor[from=natoapp6c neutral land]{north west} + \inheritanchor[from=natoapp6c neutral land]{south east} + \inheritanchor[from=natoapp6c neutral land]{south west} + \inheritanchor[from=natoapp6c neutral land]{north} + \inheritanchor[from=natoapp6c neutral land]{west} + \inheritanchor[from=natoapp6c neutral land]{east} + \inheritanchor[from=natoapp6c neutral land]{south} + \inheritanchor[from=natoapp6c neutral land]{upper} + \inheritanchor[from=natoapp6c neutral land]{lower} + \inheritanchor[from=natoapp6c neutral land]{left} + \inheritanchor[from=natoapp6c neutral land]{right} + \inheritanchor[from=natoapp6c neutral land]{center} + \inheritbackgroundpath[from=natoapp6c neutral land] + \behindforegroundpath{ + \begin{n@to@pp@stroketofill} + \n@to@pp@neutr@l@init% + \n@to@pp@neutr@l@ne + \n@to@pp@neutr@l@top% + \n@to@pp@neutr@l@left% + \n@to@pp@neutr@l@bottom% + \pgfclosepath + \pgfusepath{stroke} + % + \northeast \wg@tmpa=\pgf@y% + \wg@tmpb=\wg@tmpa\advance\wg@tmpb\n@to@pp@inst@h% + % + \pgfpathmoveto{\pgfqpoint{ \n@to@pp@inst@x}{\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{-\n@to@pp@inst@x}{\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{-\n@to@pp@inst@x}{\wg@tmpa}}% + \pgfpathlineto{\pgfqpoint{ \n@to@pp@inst@x}{\wg@tmpa}}% + \pgfclosepath + \pgfusepath{fill}% + \end{n@to@pp@stroketofill} + } +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c neutral sea surface} +% +% The neutral sea surface command. Same as land command. +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c neutral sea surface}{% + \inheritsavedanchors[from=natoapp6c neutral equipment] + \inheritanchor[from=natoapp6c neutral equipment]{inner north east} + \inheritanchor[from=natoapp6c neutral equipment]{inner north west} + \inheritanchor[from=natoapp6c neutral equipment]{inner south west} + \inheritanchor[from=natoapp6c neutral equipment]{inner south east} + \inheritanchor[from=natoapp6c neutral equipment]{north east} + \inheritanchor[from=natoapp6c neutral equipment]{north west} + \inheritanchor[from=natoapp6c neutral equipment]{south east} + \inheritanchor[from=natoapp6c neutral equipment]{south west} + \inheritanchor[from=natoapp6c neutral equipment]{north} + \inheritanchor[from=natoapp6c neutral equipment]{west} + \inheritanchor[from=natoapp6c neutral equipment]{east} + \inheritanchor[from=natoapp6c neutral equipment]{south} + \inheritanchor[from=natoapp6c neutral equipment]{upper} + \inheritanchor[from=natoapp6c neutral equipment]{lower} + \inheritanchor[from=natoapp6c neutral equipment]{left} + \inheritanchor[from=natoapp6c neutral equipment]{right} + \inheritanchor[from=natoapp6c neutral equipment]{center} + \inheritbackgroundpath[from=natoapp6c neutral equipment] + \inheritbehindforegroundpath[from=natoapp6c neutral equipment] +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c neutral space} +% +% The neutral space command. Similar to air command but with a +% bar. +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c neutral space}{% + \inheritsavedanchors[from=natoapp6c neutral air] + \inheritanchor[from=natoapp6c neutral air]{north east} + \inheritanchor[from=natoapp6c neutral air]{north west} + \inheritanchor[from=natoapp6c neutral air]{south east} + \inheritanchor[from=natoapp6c neutral air]{south west} + \inheritanchor[from=natoapp6c neutral air]{north} + \inheritanchor[from=natoapp6c neutral air]{west} + \inheritanchor[from=natoapp6c neutral air]{east} + \inheritanchor[from=natoapp6c neutral air]{south} + \inheritanchor[from=natoapp6c neutral air]{upper} + \inheritanchor[from=natoapp6c neutral air]{lower} + \inheritanchor[from=natoapp6c neutral air]{left} + \inheritanchor[from=natoapp6c neutral air]{right} + \inheritanchor[from=natoapp6c neutral air]{center} + \inheritbackgroundpath[from=natoapp6c neutral air] + \behindforegroundpath{% + \begin{n@to@pp@stroketofill} + \n@to@pp@neutr@l@init% + \n@to@pp@neutr@l@se + \n@to@pp@neutr@l@right% + \n@to@pp@neutr@l@top% + \n@to@pp@neutr@l@left% + \pgfusepath{stroke}% + % + \n@to@pp@neutr@l@ne + \n@to@pp@neutr@l@top% + \northeast\wg@tmpa=\pgf@x\wg@tmpb=\pgf@y% + \advance\wg@tmpb-\n@to@pp@space@h + % + \pgfpathlineto{\pgfqpoint{-\wg@tmpa}{\wg@tmpc}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpa}{\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{ \wg@tmpa}{\wg@tmpb}}% + \pgfclosepath% + \pgfusepath{fill}% + \end{n@to@pp@stroketofill} + } +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c neutral sub surface} +% +% The neutral sub surface command +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c neutral sub surface}{% + \inheritsavedanchors[from=natoapp6c neutral air] + \inheritanchor[from=natoapp6c neutral air]{north east} + \inheritanchor[from=natoapp6c neutral air]{north west} + \inheritanchor[from=natoapp6c neutral air]{south east} + \inheritanchor[from=natoapp6c neutral air]{south west} + \inheritanchor[from=natoapp6c neutral air]{north} + \inheritanchor[from=natoapp6c neutral air]{west} + \inheritanchor[from=natoapp6c neutral air]{east} + \inheritanchor[from=natoapp6c neutral air]{south} + \inheritanchor[from=natoapp6c neutral air]{upper} + \inheritanchor[from=natoapp6c neutral air]{lower} + \inheritanchor[from=natoapp6c neutral air]{left} + \inheritanchor[from=natoapp6c neutral air]{right} + \inheritanchor[from=natoapp6c neutral air]{center} + \backgroundpath{% + \n@to@pp@neutr@l@init% + \n@to@pp@neutr@l@nw + \n@to@pp@neutr@l@left% + \n@to@pp@neutr@l@bottom% + \n@to@pp@neutr@l@right% + } + \behindforegroundpath{% + \n@to@pp@neutr@l@init% + \n@to@pp@neutr@l@nw + \n@to@pp@neutr@l@left% + \n@to@pp@neutr@l@bottom% + \n@to@pp@neutr@l@right% + \pgfusepath{stroke}% + } +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +%</natoapp6c> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/natoapp6c/frames/unknown.dtx b/macros/latex/contrib/wargame/source/natoapp6c/frames/unknown.dtx new file mode 100644 index 0000000000..e6bd3aec38 --- /dev/null +++ b/macros/latex/contrib/wargame/source/natoapp6c/frames/unknown.dtx @@ -0,0 +1,483 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*natoapp6c> +% \fi +% \subsubsection{`Unknown' node shapes} +% +% +% Macro to define unknown path elements +% +% \begin{macrocode} +\def\n@to@pp@unknown@init{% + \def\n@to@pp@unknown@top{% + \innernortheast \wg@tmpa=\pgf@x% + \cntrlnortheast \wg@tmpb=\pgf@x% + \pgfpathcurveto{% + \pgfqpoint{ \wg@tmpa}{\wg@tmpb}}{% + \pgfqpoint{-\wg@tmpa}{\wg@tmpb}}{% + \pgfqpoint{-\wg@tmpa}{\wg@tmpa}}} + \def\n@to@pp@unknown@left{% + \innernortheast \wg@tmpa=\pgf@x% + \cntrlnortheast \wg@tmpb=\pgf@x% + \pgfpathcurveto{% + \pgfqpoint{-\wg@tmpb}{ \wg@tmpa}}{% + \pgfqpoint{-\wg@tmpb}{-\wg@tmpa}}{% + \pgfqpoint{-\wg@tmpa}{-\wg@tmpa}}} + \def\n@to@pp@unknown@bottom{% + \innernortheast \wg@tmpa=\pgf@x% + \cntrlnortheast \wg@tmpb=\pgf@x% + \pgfpathcurveto{% + \pgfqpoint{-\wg@tmpa}{-\wg@tmpb}}{% + \pgfqpoint{ \wg@tmpa}{-\wg@tmpb}}{% + \pgfqpoint{ \wg@tmpa}{-\wg@tmpa}}} + \def\n@to@pp@unknown@right{% + \innernortheast \wg@tmpa=\pgf@x% + \cntrlnortheast \wg@tmpb=\pgf@x% + \pgfpathcurveto{% + \pgfqpoint{ \wg@tmpb}{-\wg@tmpa}}{% + \pgfqpoint{ \wg@tmpb}{ \wg@tmpa}}{% + \pgfqpoint{ \wg@tmpa}{ \wg@tmpa}}} +} +% \end{macrocode} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c unknown land} +% +% The unknown land command +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c unknown land}{% + \inheritsavedanchors[from=natoapp6c base] + \savedanchor\innernortheast{\pgf@x=.7\n@to@pp@r\pgf@y=.7\n@to@pp@r} + \savedanchor\cntrlnortheast{\pgf@x=1.6\n@to@pp@r\pgf@y=1.6\n@to@pp@r} + \savedanchor\northeast{\pgf@x=1.4\n@to@pp@r\pgf@y=1.4\n@to@pp@r} + \anchor{inner north east}{\innernortheast} + \anchor{inner north west}{\innernortheast\pgf@x=-\pgf@x} + \anchor{inner south west}{\innernortheast\pgf@x=-\pgf@x\pgf@y=-\pgf@y} + \anchor{inner south east}{\innernortheast\pgf@y=-\pgf@y} + \anchor{north east}{\northeast} + \anchor{north west}{\northeast\pgf@x=-\pgf@x} + \anchor{south west}{\northeast\pgf@x=-\pgf@x\pgf@y=-\pgf@y} + \anchor{south east}{\northeast\pgf@y=-\pgf@y} + \anchor{north}{\northeast\pgf@x=0cm} + \anchor{east}{\northeast\pgf@y=0cm} + \anchor{south}{\northeast\pgf@x=0cm\pgf@y=-\pgf@y} + \anchor{west}{\northeast\pgf@x=-\pgf@x\pgf@y=0cm} + \inheritanchor[from=natoapp6c base]{center} + \inheritanchor[from=natoapp6c base]{upper} + \inheritanchor[from=natoapp6c base]{lower} + \inheritanchor[from=natoapp6c base]{left} + \inheritanchor[from=natoapp6c base]{right} + \backgroundpath{% + \n@to@pp@unknown@init + \innernortheast \wg@tmpa=\pgf@x% + \pgfpathmoveto{\pgfqpoint{\wg@tmpa}{-\wg@tmpa}}% + \n@to@pp@unknown@right % + \n@to@pp@unknown@top % + \n@to@pp@unknown@left % + \n@to@pp@unknown@bottom% + } + \behindforegroundpath{% + \n@to@pp@unknown@init + \innernortheast \wg@tmpa=\pgf@x% + \pgfpathmoveto{\pgfqpoint{\wg@tmpa}{-\wg@tmpa}}% + \n@to@pp@unknown@right % + \n@to@pp@unknown@top % + \n@to@pp@unknown@left % + \n@to@pp@unknown@bottom% + \pgfusepath{stroke}} +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c unknown air} +% +% The unknown air command. To consider: Should clipping path extend +% below the actual symbol to include that part of the base symbol? +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c unknown air}{% + \inheritsavedanchors[from=natoapp6c unknown land] + \inheritanchor[from=natoapp6c unknown land]{inner north east} + \inheritanchor[from=natoapp6c unknown land]{inner north west} + \inheritanchor[from=natoapp6c unknown land]{inner south west} + \inheritanchor[from=natoapp6c unknown land]{inner south east} + \inheritanchor[from=natoapp6c unknown land]{north east} + \inheritanchor[from=natoapp6c unknown land]{north west} + \inheritanchor[from=natoapp6c unknown land]{north} + \inheritanchor[from=natoapp6c unknown land]{west} + \inheritanchor[from=natoapp6c unknown land]{east} + \inheritanchor[from=natoapp6c unknown land]{upper} + \inheritanchor[from=natoapp6c unknown land]{lower} + \inheritanchor[from=natoapp6c unknown land]{left} + \inheritanchor[from=natoapp6c unknown land]{right} + \inheritanchor[from=natoapp6c unknown land]{center} + \anchor{south}{\innernortheast\pgf@x=0cm\pgf@y=-\pgf@y} + \anchor{south east}{ + \northeast\wg@tmpa=\pgf@x + \innernortheast\pgf@y=-\pgf@y + \pgf@x=\wg@tmpa} + \anchor{south west}{ + \northeast\wg@tmpa=\pgf@x + \innernortheast\pgf@y=-\pgf@y + \pgf@x=-\wg@tmpa} + \backgroundpath{% + \n@to@pp@unknown@init + \innernortheast \wg@tmpa=\pgf@x% + \pgfpathmoveto{\pgfqpoint{\wg@tmpa}{-\wg@tmpa}}% + \n@to@pp@unknown@right % + \n@to@pp@unknown@top % + \n@to@pp@unknown@left % + \ifn@to@pp@isclip + \pgfpathlineto{\pgfqpoint{0cm}{-\radius}} + \pgfpathclose + \fi + } + \behindforegroundpath{% + \n@to@pp@unknown@init + \innernortheast \wg@tmpa=\pgf@x% + \pgfpathmoveto{\pgfqpoint{\wg@tmpa}{-\wg@tmpa}}% + \n@to@pp@unknown@right % + \n@to@pp@unknown@top % + \n@to@pp@unknown@left % + \pgfusepath{stroke}% + } +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c unknown activity} +% +% The unknown activity command. Similar to land command, but with +% boxes in the the `corners'. +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c unknown activity}{% + \inheritsavedanchors[from=natoapp6c unknown land] + \inheritanchor[from=natoapp6c unknown land]{inner north east} + \inheritanchor[from=natoapp6c unknown land]{inner north west} + \inheritanchor[from=natoapp6c unknown land]{inner south west} + \inheritanchor[from=natoapp6c unknown land]{inner south east} + \inheritanchor[from=natoapp6c unknown land]{north east} + \inheritanchor[from=natoapp6c unknown land]{north west} + \inheritanchor[from=natoapp6c unknown land]{south east} + \inheritanchor[from=natoapp6c unknown land]{south west} + \inheritanchor[from=natoapp6c unknown land]{north} + \inheritanchor[from=natoapp6c unknown land]{west} + \inheritanchor[from=natoapp6c unknown land]{east} + \inheritanchor[from=natoapp6c unknown land]{south} + \inheritanchor[from=natoapp6c unknown land]{upper} + \inheritanchor[from=natoapp6c unknown land]{lower} + \inheritanchor[from=natoapp6c unknown land]{left} + \inheritanchor[from=natoapp6c unknown land]{right} + \inheritanchor[from=natoapp6c unknown land]{center} + \inheritbackgroundpath[from=natoapp6c unknown land] + \behindforegroundpath{ + \n@to@pp@unknown@init + \innernortheast \wg@tmpa=\pgf@x% + \begin{n@to@pp@stroketofill} + \pgfpathmoveto{\pgfqpoint{\wg@tmpa}{-\wg@tmpa}}% + \n@to@pp@unknown@right % + \n@to@pp@unknown@top % + \n@to@pp@unknown@left % + \n@to@pp@unknown@bottom% + \pgfusepath{stroke,clip} + % + \northeast\wg@tmpa\pgf@x + \advance\wg@tmpa0.005cm + \wg@tmpb=\wg@tmpa + \advance\wg@tmpb-\n@to@pp@act@w + \wg@tmpc=\n@to@pp@act@w + \divide\wg@tmpc2 + % + \pgfpathmoveto{\pgfqpoint{ \wg@tmpc}{\wg@tmpa}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpc}{\wg@tmpa}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpc}{\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{ \wg@tmpc}{\wg@tmpb}}% + \pgfclosepath% + \pgfusepath{fill} + % + \pgfpathmoveto{\pgfqpoint{ \wg@tmpc}{-\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpc}{-\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpc}{-\wg@tmpa}}% + \pgfpathlineto{\pgfqpoint{ \wg@tmpc}{-\wg@tmpa}}% + \pgfclosepath% + \pgfusepath{fill} + % + \pgfpathmoveto{\pgfqpoint{ \wg@tmpa}{ \wg@tmpc}}% + \pgfpathlineto{\pgfqpoint{ \wg@tmpb}{ \wg@tmpc}}% + \pgfpathlineto{\pgfqpoint{ \wg@tmpb}{-\wg@tmpc}}% + \pgfpathlineto{\pgfqpoint{ \wg@tmpa}{-\wg@tmpc}}% + \pgfclosepath% + \pgfusepath{fill} + % + \pgfpathmoveto{\pgfqpoint{-\wg@tmpb}{ \wg@tmpc}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpa}{ \wg@tmpc}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpa}{-\wg@tmpc}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpb}{-\wg@tmpc}}% + \pgfclosepath% + \pgfusepath{fill} + \end{n@to@pp@stroketofill} + } +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c unknown equipment} +% +% The unknown equipment command. Same as land command. +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c unknown equipment}{% + \inheritsavedanchors[from=natoapp6c unknown land] + \inheritanchor[from=natoapp6c unknown land]{inner north east} + \inheritanchor[from=natoapp6c unknown land]{inner north west} + \inheritanchor[from=natoapp6c unknown land]{inner south west} + \inheritanchor[from=natoapp6c unknown land]{inner south east} + \inheritanchor[from=natoapp6c unknown land]{north east} + \inheritanchor[from=natoapp6c unknown land]{north west} + \inheritanchor[from=natoapp6c unknown land]{south east} + \inheritanchor[from=natoapp6c unknown land]{south west} + \inheritanchor[from=natoapp6c unknown land]{north} + \inheritanchor[from=natoapp6c unknown land]{west} + \inheritanchor[from=natoapp6c unknown land]{east} + \inheritanchor[from=natoapp6c unknown land]{south} + \inheritanchor[from=natoapp6c unknown land]{upper} + \inheritanchor[from=natoapp6c unknown land]{lower} + \inheritanchor[from=natoapp6c unknown land]{left} + \inheritanchor[from=natoapp6c unknown land]{right} + \inheritanchor[from=natoapp6c unknown land]{center} + \inheritbackgroundpath[from=natoapp6c unknown land] + \inheritbehindforegroundpath[from=natoapp6c unknown land] +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c unknown installation} +% +% The unknown installation command. Similar to land command, but +% with a `hat' on top. Note, NATO App6(d) makes the `hat' lower +% part disconnected from the main symbol. I find that ugly, so we +% do it like NATO App6(c). +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c unknown installation}{% + \inheritsavedanchors[from=natoapp6c unknown land] + \inheritanchor[from=natoapp6c unknown land]{center} + \inheritanchor[from=natoapp6c unknown land]{inner north east} + \inheritanchor[from=natoapp6c unknown land]{inner north west} + \inheritanchor[from=natoapp6c unknown land]{inner south west} + \inheritanchor[from=natoapp6c unknown land]{inner south east} + \inheritanchor[from=natoapp6c unknown land]{north east} + \inheritanchor[from=natoapp6c unknown land]{north west} + \inheritanchor[from=natoapp6c unknown land]{south east} + \inheritanchor[from=natoapp6c unknown land]{south west} + \inheritanchor[from=natoapp6c unknown land]{north} + \inheritanchor[from=natoapp6c unknown land]{west} + \inheritanchor[from=natoapp6c unknown land]{east} + \inheritanchor[from=natoapp6c unknown land]{south} + \inheritanchor[from=natoapp6c unknown land]{upper} + \inheritanchor[from=natoapp6c unknown land]{lower} + \inheritanchor[from=natoapp6c unknown land]{left} + \inheritanchor[from=natoapp6c unknown land]{right} + \inheritanchor[from=natoapp6c unknown land]{center} + \inheritbackgroundpath[from=natoapp6c unknown land] + \behindforegroundpath{ + \n@to@pp@unknown@init + \innernortheast \wg@tmpa=\pgf@x% + + \pgfpathmoveto{\pgfqpoint{\wg@tmpa}{-\wg@tmpa}}% + \n@to@pp@unknown@right % + \n@to@pp@unknown@top % + \n@to@pp@unknown@left % + \n@to@pp@unknown@bottom% + \pgfusepath{stroke} + % + \begin{n@to@pp@stroketofill} + \pgfpathmoveto{\pgfqpoint{\wg@tmpa}{\wg@tmpa}}% + \n@to@pp@unknown@top % + % + \northeast\wg@tmpb=\pgf@y\wg@tmpc=\pgf@y% + \advance\wg@tmpb\n@to@pp@inst@h% + \advance\wg@tmpb-0.05cm% + \advance\wg@tmpc-\n@to@pp@inst@h% + \advance\wg@tmpc-\n@to@pp@inst@h% + % + \pgfpathlineto{\pgfqpoint{-\wg@tmpa}{\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{ \wg@tmpa}{\wg@tmpb}}% + \pgfclosepath% + \pgfusepath{clip}% + % + \pgfpathmoveto{\pgfqpoint{ \n@to@pp@inst@x}{\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{-\n@to@pp@inst@x}{\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{-\n@to@pp@inst@x}{\wg@tmpc}}% + \pgfpathlineto{\pgfqpoint{ \n@to@pp@inst@x}{\wg@tmpc}}% + \pgfclosepath% + \pgfusepath{fill}% + \end{n@to@pp@stroketofill} + } +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c unknown sea surface} +% +% The unknown sea surface command. Same as land command +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c unknown sea surface}{% + \inheritsavedanchors[from=natoapp6c unknown land] + \inheritanchor[from=natoapp6c unknown land]{inner north east} + \inheritanchor[from=natoapp6c unknown land]{inner north west} + \inheritanchor[from=natoapp6c unknown land]{inner south west} + \inheritanchor[from=natoapp6c unknown land]{inner south east} + \inheritanchor[from=natoapp6c unknown land]{north east} + \inheritanchor[from=natoapp6c unknown land]{north west} + \inheritanchor[from=natoapp6c unknown land]{south east} + \inheritanchor[from=natoapp6c unknown land]{south west} + \inheritanchor[from=natoapp6c unknown land]{north} + \inheritanchor[from=natoapp6c unknown land]{west} + \inheritanchor[from=natoapp6c unknown land]{east} + \inheritanchor[from=natoapp6c unknown land]{south} + \inheritanchor[from=natoapp6c unknown land]{upper} + \inheritanchor[from=natoapp6c unknown land]{lower} + \inheritanchor[from=natoapp6c unknown land]{left} + \inheritanchor[from=natoapp6c unknown land]{right} + \inheritanchor[from=natoapp6c unknown land]{center} + \inheritbackgroundpath[from=natoapp6c unknown land] + \inheritbehindforegroundpath[from=natoapp6c unknown land] +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c unknown space} +% +% The unknown space command. Similar to air command, but with a top +% bar. +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c unknown space}{% + \inheritsavedanchors[from=natoapp6c unknown air] + \inheritanchor[from=natoapp6c unknown air]{inner north east} + \inheritanchor[from=natoapp6c unknown air]{inner north west} + \inheritanchor[from=natoapp6c unknown air]{inner south west} + \inheritanchor[from=natoapp6c unknown air]{inner south east} + \inheritanchor[from=natoapp6c unknown air]{north east} + \inheritanchor[from=natoapp6c unknown air]{north west} + \inheritanchor[from=natoapp6c unknown air]{south east} + \inheritanchor[from=natoapp6c unknown air]{south west} + \inheritanchor[from=natoapp6c unknown air]{north} + \inheritanchor[from=natoapp6c unknown air]{west} + \inheritanchor[from=natoapp6c unknown air]{east} + \inheritanchor[from=natoapp6c unknown air]{south} + \inheritanchor[from=natoapp6c unknown air]{upper} + \inheritanchor[from=natoapp6c unknown air]{lower} + \inheritanchor[from=natoapp6c unknown air]{left} + \inheritanchor[from=natoapp6c unknown air]{right} + \inheritanchor[from=natoapp6c unknown air]{center} + \inheritbackgroundpath[from=natoapp6c unknown air] + \behindforegroundpath{% + \n@to@pp@unknown@init + \innernortheast \wg@tmpa=\pgf@x% + \begin{n@to@pp@stroketofill} + \pgfpathmoveto{\pgfqpoint{\wg@tmpa}{-\wg@tmpa}}% + \n@to@pp@unknown@right % + \n@to@pp@unknown@top % + \n@to@pp@unknown@left % + \pgfusepath{stroke,clip}% + % + \northeast\wg@tmpa=\pgf@y\wg@tmpb=\pgf@y + \advance\wg@tmpb-\n@to@pp@space@h + % + \pgfpathmoveto{\pgfqpoint{ \radius}{\wg@tmpa}}% + \pgfpathlineto{\pgfqpoint{-\radius}{\wg@tmpa}}% + \pgfpathlineto{\pgfqpoint{-\radius}{\wg@tmpb}}% + \pgfpathlineto{\pgfqpoint{ \radius}{\wg@tmpb}}% + \pgfclosepath% + \pgfusepath{fill}% + \end{n@to@pp@stroketofill} + } +} +% \end{macrocode} +% \end{NatoAppFrame} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppFrame}{natoapp6c unknown sub surface} +% +% The unknown sub surface command. +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c unknown sub surface}{% + \inheritsavedanchors[from=natoapp6c unknown land] + \inheritanchor[from=natoapp6c unknown land]{inner north east} + \inheritanchor[from=natoapp6c unknown land]{inner north west} + \inheritanchor[from=natoapp6c unknown land]{inner south west} + \inheritanchor[from=natoapp6c unknown land]{inner south east} + \inheritanchor[from=natoapp6c unknown land]{south east} + \inheritanchor[from=natoapp6c unknown land]{south west} + \inheritanchor[from=natoapp6c unknown land]{south} + \inheritanchor[from=natoapp6c unknown land]{west} + \inheritanchor[from=natoapp6c unknown land]{east} + \inheritanchor[from=natoapp6c unknown land]{upper} + \inheritanchor[from=natoapp6c unknown land]{lower} + \inheritanchor[from=natoapp6c unknown land]{left} + \inheritanchor[from=natoapp6c unknown land]{right} + \inheritanchor[from=natoapp6c unknown land]{center} + \anchor{north}{\innernortheast\pgf@x=0cm} + \anchor{north east}{ + \northeast\wg@tmpa=\pgf@x + \innernortheast\pgf@y=\pgf@y + \pgf@x=\wg@tmpa} + \anchor{north west}{ + \northeast\wg@tmpa=\pgf@x + \innernortheast\pgf@y=\pgf@y + \pgf@x=-\wg@tmpa} + \backgroundpath{% + \n@to@pp@unknown@init + \innernortheast \wg@tmpa=\pgf@x% + \pgfpathmoveto{\pgfqpoint{-\wg@tmpa}{\wg@tmpa}}% + \n@to@pp@unknown@left % + \n@to@pp@unknown@bottom % + \n@to@pp@unknown@right % + \ifn@to@pp@isclip + \pgfpathlineto{\pgfqpoint{0cm}{\radius}} + \pgfpathclose + \fi + } + \behindforegroundpath{% + \n@to@pp@unknown@init + \innernortheast \wg@tmpa=\pgf@x% + \pgfpathmoveto{\pgfqpoint{-\wg@tmpa}{\wg@tmpa}}% + \n@to@pp@unknown@left % + \n@to@pp@unknown@bottom % + \n@to@pp@unknown@right % + \pgfusepath{stroke}} +} +% \end{macrocode} +% \end{NatoAppFrame} +% \iffalse +%</natoapp6c> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/natoapp6c/list.dtx b/macros/latex/contrib/wargame/source/natoapp6c/list.dtx new file mode 100644 index 0000000000..0500f01326 --- /dev/null +++ b/macros/latex/contrib/wargame/source/natoapp6c/list.dtx @@ -0,0 +1,266 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*natoapp6c> +% \fi +% \begin{Macro}{\n@to@pp@s@ll} +% +% A list of all defined symbols +% +% \begin{macrocode} +\def\n@to@pp@s@ll{ + weapon=base, + weapon=top, + weapon=bottom, + weapon=rifle, + weapon=machine gun, + weapon=grenade launcher, + weapon=missile launcher, + weapon=non lethal, + weapon=multi fire, + weapon=air defence, + weapon=anti tank, + weapon=full, + weapon, + type=light, + type=medium, + type=heavy, + type=vlight, + type=vmedium, + type=vheavy, + type, + above corps support, + air assault with organic lift, + air decoy, + air assault, + air defence, + air strip, + air traffic, + airship, + airborne, + ammunition, + amphibious, + amphibious warfare ship, + analysis, + arrest, + artillery, + anti tank anti armour, + antenna, + armoured, + armoured fighting vehicle, + armoured personnel carrier, + arctic, + automobile, + balloon, + bar, + base, + bicycle equipped, + boat, + booby trap, + bottomed, + bridge=none, + bridge=fixed, + bridge=folding, + bridge=hollow, + bridge, + capsule, + carrier, + chemical biological radiological nuclear, + civilian military cooperation, + civilian police, + civilian telecommunications, + coast guard vessel, + combat support, + combatant, + combined arms, + computer system, + control, + convoy, + corps support, + crime, + decoy, + direct communications, + direction finding, + diving=none, + diving=military, + diving, + drilling, + earthmover, + electric power, + electronic ranging, + electronic warfare wide, + engineer, + enhanced location reporting system, + environmental protection, + explosion, + finance, + fishing vessel, + fire protection, + fixed and rotary wing, + fixed wing, + flame thrower, + floating, + surfaced, + food, + fuel, + grenade launcher=none, + grenade launcher=non lethal, + grenade launcher, + graffiti, + group, + gun=base, + gun=air defence, + gun=anti tank, + gun=direct, + gun=recoilless, + gun, + headquarters, + house, + howitzer, + in position, + individual, + infantry, + intermodal, + jagged wave, + jam, + jamming, + jetski, + killing, + labour, + land mine=personnel, + land mine=tank, + land mine=none, + land mine, + land missile, + laser, + launcher, + laundry, + machine gun, + main gun, + maintenance, + medic, + medical, + medical treatment, + mine, + mine clearing equipment, + mine warfare vessel, + missile, + missile launcher=base, + missile launcher=none, + missile launcher=air defence, + missile launcher=anti tank, + missile launcher=surface to surface, + missile launcher, + mobile advisor and support, + moored, + mortar, + motorized, + mortuary affairs, + mountain, + naval, + navigation, + navy task, + non combatant, + non lethal weapon, + nuclear, + observer, + orbiter shuttle, + ordnance, + organisation, + over snow, + pack animal, + patrol, + patrolling, + physician, + pipeline, + poisoning, + postal, + printed media, + psychological, + quarry, + quartermaster, + radar, + radio, + radio relay, + radio relay line of sight, + radio teletype, + railroad, + reconnaissance, + recovery unmanned systems, + rifle, + rising, + riverine, + rocket launcher=base, + rocket launcher=anti tank, + rocket launcher=single, + rocket launcher=multiple, + rocket launcher=single head, + rocket launcher=multiple head, + rocket launcher, + rotary wing, + runway, + sailing boat, + satellite=none, + satellite=astronomical, + satellite=bio, + satellite=communications, + satellite=navigation, + satellite=earth observing, + satellite=tether, + satellite=small, + satellite=reconnaissance, + satellite, + sea mine=top half, + sea mine=bottom half, + sea mine=full, + sea mine=neutralised, + sea mine=neutralized, + sea mine, + seabed installation, + search, + searching, + semi trailer truck, + sensor, + ship, + signal, + signals intelligence, + ski, + sled, + small squashed text=TXT, + small text=TXT, + sniper, + space station, + squashed text=TXT, + submarine, + submersible, + supply, + surface combatant, + survey, + tactical satellite, + tank, + text=TXT, + topographic, + torpedo, + towed, + tracked, + train locomotive, + transportation, + unexploded ordnance, + unmanned, + utility vehicle, + vehicle, + video imagery, + warfare vessel, + water, + wheeled=and tracked, + wheeled=limited, + wheeled=cross country, + wheeled=semi, + wheeled +} +% \end{macrocode} +% \end{Macro} +% +% \iffalse +% </natoapp6c> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/natoapp6c/shape.dtx b/macros/latex/contrib/wargame/source/natoapp6c/shape.dtx new file mode 100644 index 0000000000..029be911b7 --- /dev/null +++ b/macros/latex/contrib/wargame/source/natoapp6c/shape.dtx @@ -0,0 +1,647 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*natoapp6c> +% \fi +% \subsubsection{Text \texttt{natoapp6c} namespace} +% +% \begin{NatoAppKey}{/natoapp6c} +% +% Here, we set up the key path \spec{/natoapp6c} +% +% \begin{macrocode} +\def\natoapp@report{} +\tikzset{ + /natoapp6c/.search also={/tikz}, + /natoapp6c/.cd, +} +% \end{macrocode} +% \end{NatoAppKey} +% +% \subsubsubsection{Choices of faction, command, and echelon} +% +% \begin{NatoAppKey}{natoapp6c/id, +% natoapp6c/fac, +% natoapp6c/cmd, +% natoapp6c/ech} +% +% The keys \spec{id}, spec{fac}, \spec{cmd}, and \spec{ech} are +% internal keys used to store the choice of faction, command, and +% echelon, respectively, in. +% +% \begin{macrocode} +\tikzset{ + /natoapp6c/.cd, + id/.store in=\natoapp@id, + fac/.store in=\natoapp@fac, + cmd/.store in=\natoapp@cmd, + ech/.store in=\natoapp@ech, +} +% \end{macrocode} +% \end{NatoAppKey} +% +% \begin{NatoAppKey}{natoapp6c/faction} +% +% Choice of \meta{faction}. This is limited to predefined values. +% The choice is stored in the key \spec{natoapp6c/fac}. +% +% \begin{macrocode} +\tikzset{ + /natoapp6c/.cd, + faction/.is choice, + faction/none/.code={\let\natoapp@fac\@undefined}, + faction/friendly/.style={fac=friendly}, + faction/friend/.style={fac=friendly}, + faction/hostile/.style={fac=hostile}, + faction/enemy/.style={fac=hostile}, + faction/neutral/.style={fac=neutral}, + faction/unknown/.style={fac=unknown}, + faction/?/.style={fac=unknown}, + faction/.initial=friendly, +} +% \end{macrocode} +% \end{NatoAppKey} +% +% \begin{NatoAppKey}{natoapp6c/command} +% +% Choice of \meta{command}. This is limited to predefined values. +% The choice is stored in the key \spec{natoapp6c/cmd}. +% +% \begin{macrocode} +\tikzset{ + /natoapp6c/.cd, + command/.is choice, + command/base/.style={cmd=base}, + command/activity/.style={cmd=activity}, + command/air/.style={cmd=air}, + command/missile/.style={cmd=air}, + command/equipment/.style={cmd=equipment}, + command/installation/.style={cmd=installation}, + command/land/.style={cmd=land}, + command/sea surface/.style={cmd=sea surface}, + command/space/.style={cmd=space}, + command/sub surface/.style={cmd=sub surface}, + command/sea mine/.style={cmd=sub surface}, +} +% \end{macrocode} +% \end{NatoAppKey} +% +% \begin{NatoAppKey}{natoapp6c/echolon} +% +% Unit size. The choice is limited to one of the below. The choice +% is stored in the key \spec{natoapp6c/ech}. +% +% \begin{macrocode} +\tikzset{ + /natoapp6c/.cd, + echelon/.is choice, + echelon/none/.style={ech=}, + echelon/team/.style={ech=}, + echelon/squad/.style={ech=squad}, + echelon/section/.style={ech=section}, + echelon/platoon/.style={ech=platoon}, + echelon/company/.style={ech=company}, + echelon/battalion/.style={ech=battalion}, + echelon/regiment/.style={ech=regiment}, + echelon/brigade/.style={ech=brigade}, + echelon/division/.style={ech=division}, + echelon/corps/.style={ech=corps}, + echelon/army/.style={ech=army}, + echelon/army group/.style={ech=army group}, + echelon/theatre/.style={ech=theatre}, + echelon/command/.style={ech=command}, + echelon/dummy/.style={ech=dummy}, +} +% \end{macrocode} +% \end{NatoAppKey} +% +% \begin{NatoAppKey}{natoapp6c/main, +% natoapp6c/left, +% natoapp6c/right, +% natoapp6c/top, +% natoapp6c/bottom, +% natoapp6c/below, +% natoapp6c/frame} +% \begin{Macro}{\natoapp@main, +% \natoapp@left, +% \natoapp@right, +% \natoapp@upper, +% \natoapp@lower, +% \natoapp@below} +% +% The various parts of the symbols. The keys \spec{upper} and +% \spec{lower} are aliases for \spec{top} and \spec{bottom}, +% respectively. The choices are stored in macros +% +% \begin{macrocode} +\newif\ifnatoapp@decoy\natoapp@decoyfalse +\tikzset{ + /natoapp6c/.cd, + main/.store in=\natoapp@main, main/.initial=,% + left/.store in=\natoapp@left, left/.initial=,% + right/.store in=\natoapp@right, right/.initial=,% + upper/.store in=\natoapp@upper, upper/.initial=,% + lower/.store in=\natoapp@lower, lower/.initial=,% + top/.store in=\natoapp@upper,% + bottom/.store in=\natoapp@lower,% + below/.store in=\natoapp@below, below/.initial=,% + frame/.store in=\natoapp@frame, frame/.initial=,% + decoy/.is if=natoapp@decoy,% +} +% \end{macrocode} +% \end{Macro} +% \end{NatoAppKey} +% +% \begin{TikzKey}{/tikz/natoapp6c/main, +% /tikz/natoapp6c/modifiers, +% /tikz/natoapp6c/lower, +% /tikz/natoapp6c/upper, +% /tikz/natoapp6c/left, +% /tikz/natoapp6c/right, +% /tikz/natoapp6c/echelon, +% /tikz/natoapp6c/below} +% +% Styles used by the various parts of the symbol. +% +% \begin{macrocode} +\tikzset{ + natoapp6c/parts/.style={draw,shape=rectangle,transform shape}, + natoapp6c/main/.style={natoapp6c/parts}, + natoapp6c/modifiers/.style={natoapp6c/parts,scale=.6}, + natoapp6c/lower/.style={natoapp6c/parts}, + natoapp6c/upper/.style={natoapp6c/parts}, + natoapp6c/left/.style={natoapp6c/parts}, + natoapp6c/right/.style={natoapp6c/parts}, + natoapp6c/echelon/.style={natoapp6c/parts}, + natoapp6c/below/.style={natoapp6c/parts} +} +% \end{macrocode} +% \end{TikzKey} +% \iffalse +% -------------------------------------------------------------------- +% \fi +% +% \subsubsection{The \texttt{natoapp6c} styles} +% +% \begin{TikzKey}{/tikz/natoapp6c} +% This key sets up a node to make a NATO App6(c) symbol. The key +% takes a single argument which in turn must contain key--value +% pairs in the \texttt{/natoapp6c} (or \texttt{/tikz}) namespace(s). We +% set the \texttt{shape} parameter of the node, and calls the passed +% keys in the \texttt{/natoapp6c} namespace to set-up elements of the +% chit. +% +% \begin{macrocode} +\tikzset{% + natoapp6c/.code={% + \pgfkeys{/tikz/transform shape,/tikz/shape=natoapp6c} + \pgfkeys{/natoapp6c/.cd,#1}}} +% \end{macrocode} +% \end{TikzKey} +% +% We define a counter to set-up unique names for symbol nodes. +% +% \begin{macrocode} +\newcounter{natoappid}\setcounter{natoappid}{0} +% \end{macrocode} +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% \subsubsection{The \cs{natoapp6c} shape} +% +% \begin{Macro}{\ifn@to@pp@below,\ifn@to@pp@mod} +% +% We define an \cs{if} to allow us to detect if something is +% rendered below the frame +% +% \begin{macrocode} +\newif\ifn@to@pp@below\n@to@pp@belowfalse% +\newif\ifn@to@pp@mod\n@to@pp@modfalse% +% \end{macrocode} +% \end{Macro} +% +% \begin{NatoAppFrame}{natoapp6c} +% +% Next, we define the mother shape of NATO App6(c) nodes. This is a +% composite node with sub-nodes for the various parts (including the +% frame) of the symbol. +% +% It is quite complex so we will go through the implementation in +% bits. +% +% First, we make some saved anchors (the centre) and macros +% (identifier, frame type, and frame options). +% +% \begin{macrocode} +\pgfdeclareshape{natoapp6c}{% + \savedanchor\center{\pgf@x=0cm\pgf@y=0cm} + \savedmacro\id{% + \n@to@pp@dbg{3}{NATO App6(c) id (set): \meaning\natoapp@id} + \@ifundefined{natoapp@id}{\let\natoapp@id\pgfutil@empty}{}% + \ifx\natoapp@id\pgfutil@empty\relax% + \wg@r@ndom@id% + \edef\id{natoapp6c\wg@uuid}% + \else% + \edef\id{\natoapp@id}% + \fi% + \n@to@pp@dbg{3}{NATO App6(c) id: \meaning\id}} + \savedmacro\frameshape{% + \let\frameshape\pgfutil@empty% + \@ifundefined{natoapp@cmd}{\def\frameshape{base}}{% + \edef\frameshape{\natoapp@cmd} + \@ifundefined{natoapp@fac}{\def\frameshape{base}}{% + \edef\frameshape{\natoapp@fac\space\frameshape}}} + \n@to@pp@dbg{3}{NATO App6(c) frame shape: \meaning\frameshape}} + \savedmacro\frameopt{% + \let\frameopt\pgfutil@empty% + \@ifundefined{natoapp@frame}{}{% + \edef\frameopt{\natoapp@frame}} + \n@to@pp@dbg{3}{NATO App6(c) Frame options: \meaning\frameopt}% + } +% \end{macrocode} +% +% Then we define a number of regular anchors +% +% \begin{macrocode} + \anchor{center} {\center} +% \end{macrocode} +% +% The remaining anchors depend on the shape being used. We reference +% the anchors of the embedded node of the frame. +% +% \begin{macrocode} + \anchor{north east}{\wg@sub@nchor{M\id}{north east}} + \anchor{north west}{\wg@sub@nchor{M\id}{north west}} + \anchor{south east}{\wg@sub@nchor{M\id}{south east}} + \anchor{south west}{\wg@sub@nchor{M\id}{south west}} + \anchor{north} {\wg@sub@nchor{M\id}{north}} + \anchor{west} {\wg@sub@nchor{M\id}{west}} + \anchor{south} {\wg@sub@nchor{M\id}{south}} + \anchor{east} {\wg@sub@nchor{M\id}{east}} + \anchor{upper} {\wg@sub@nchor{M\id}{upper}} + \anchor{lower} {\wg@sub@nchor{M\id}{lower}} + \anchor{left} {\wg@sub@nchor{M\id}{left}} + \anchor{right} {\wg@sub@nchor{M\id}{right}} +% \end{macrocode} +% +% The next two anchors are a little funny. +% +% \begin{macrocode} + \anchor{echelon} {% + \n@to@pp@dbg{3}{NATO App6(c) get echelon anchor}% + \wg@sub@nchor{M\id}{north}% + \wg@tmpa=\n@to@pp@e@y cm% + \advance\pgf@y\wg@tmpa% + }% + \anchor{below} {% + \n@to@pp@dbg{3}{NATO App6(c) get below anchor}% + \wg@sub@nchor{M\id}{south} + \wg@tmpa=\n@to@pp@e@yy cm% + \advance\pgf@y-\wg@tmpa} +% \end{macrocode} +% +% All right, so time to make the actual frame. Note that we do this +% in a `behind' path so we can actually draw stuff. First, we flag +% that we're not in a modifier, nor in the `below' part. +% +% \begin{macrocode} + \behindbackgroundpath{% + \n@to@pp@dbg{3}{NATO App6(c) background path: \meaning\id + ^^J ID: \meaning\natoapp@id + ^^J Faction: \meaning\natoapp@fac + ^^J Command: \meaning\natoapp@cmd + ^^J Echelon: \meaning\natoapp@ech + ^^J Main: \meaning\natoapp@main + ^^J Left: \meaning\natoapp@left + ^^J Right: \meaning\natoapp@right + ^^J Upper: \meaning\natoapp@upper + ^^J Lower: \meaning\natoapp@lower + ^^J Below: \meaning\natoapp@below + ^^J Shape: \meaning\frameshape + ^^J Options: \meaning\frameopt} + \natoapp@report + \n@to@pp@modfalse + \n@to@pp@belowfalse +% \end{macrocode} +% +% If the symbol is empty, then do nothing. +% +% \begin{macrocode} + \ifx\frameshape\pgfutil@empty% + \n@to@pp@dbg{2}{NATO App6(c) has no frame!} + \else +% \end{macrocode} +% +% We start a scope because we want to do some clipping here. Then, we +% use the frame to clip the remaining part. Note that we do this via +% a node which we give the identifier \spec{M}. Various elements of +% the symbol can then refer to this shape to define paths, etc. +% +% \begin{macrocode} + \begin{scope} + \pgfinterruptboundingbox + %% Clip to shape in scope + %% \message{^^JClipping to NATO App6(c) shape} + \n@to@pp@iscliptrue% + \n@to@pp@dbg{2}{NATO App6(c) frame node M (clip)} + \pgfnode{natoapp6c \frameshape}{center}{}{M}{\pgfusepath{clip}} + \n@to@pp@isclipfalse% +% \end{macrocode} +% +% Next, we should see if we need to fill the frame. We do that by +% expanding the passed \spec{frame} key-values in a scope, and +% \emph{then} get the fill colour. +% +% \begin{macrocode} + %% Start new scope including frame key options + \edef\tmp@opt{[\frameopt]} + \expandafter\scope\tmp@opt + % Get fill color {possibly from frame key} + \expandafter\let\expandafter\tmp@fill% + \csname\string\color@pgffillcolor\endcsname% +% \end{macrocode} +% +% If the fill colour is not \cs{relax}, then we fill the frame. Note +% that this is done in the background, so when we draw in the +% foreground we will render on top of the fill. +% +% \begin{macrocode} + % Check if we need to fill shape (fill colour us not \relax) + \ifx\tmp@fill\relax\else% + \n@to@pp@dbg{2}{NATO App6(c) frame fill} + \pgfnode{natoapp6c \frameshape}{center}{}{}{\pgfusepath{fill}}% + \fi% + % End the fill scope + \endscope% +% \end{macrocode} +% +% Now we need to render some of the elements of the symbol. We start +% with the main elements. We can specify many main elements (to make +% composite symbols). +% +% \begin{macrocode} + % Render mains + \@ifundefined{natoapp@main}{}{ + \n@to@pp@dbg{2}{NATO App6(c) mains: \meaning\natoapp@main} + \begin{scope}[natoapp6c/main] + \wg@pic@all{\natoapp@main}{natoapp6c/s/}{M.center}{natoapp6c/main}% + \end{scope}}% + % Modififiers flagged +% \end{macrocode} +% +% The next thing is to render the various modifiers. We start by +% flagging this globally. +% +% \begin{macrocode} + \n@to@pp@modtrue + \n@to@pp@dbg{2}{NATO App6(c) modifiers} +% \end{macrocode} +% +% Below we render the lower, upper, left, and right elements. This is +% all done in the same way. Note that the elements positions are +% dictated by anchors of the frame shape (via shape identifier +% \spec{M}). +% +% \begin{macrocode} + % Render lowers + \@ifundefined{natoapp@lower}{}{% + \begin{scope}% + \wg@pic@all{\natoapp@lower}{natoapp6c/s/}{M.lower}{% + natoapp6c/modifiers,natoapp6c/lower}% + \end{scope}}% + % Render uppers + \@ifundefined{natoapp@upper}{}{% + \begin{scope}[] + \wg@pic@all{\natoapp@upper}{natoapp6c/s/}{M.upper}{% + natoapp6c/modifiers,natoapp6c/upper}% + \end{scope}}% + % Render lefts + \@ifundefined{natoapp@left}{}{% + \begin{scope}[] + \wg@pic@all{\natoapp@left}{natoapp6c/s/}{M.left}{% + natoapp6c/modifiers,natoapp6c/left}% + \end{scope}}% + % Render rights + \@ifundefined{natoapp@right}{}{% + \begin{scope}[] + \wg@pic@all{\natoapp@right}{natoapp6c/s/}{M.right}{% + natoapp6c/modifiers,natoapp6c/right}% + \end{scope}}% + % Modififiers end + \n@to@pp@modfalse% + \endpgfinterruptboundingbox + \end{scope}% + \fi% + } +% \end{macrocode} +% +% That concludes rendering most of the symbol. We have not put in the +% echelon, below element, or drawn the frame yet. That we will do on +% the foreground path. +% +% \begin{macrocode} +% \end{macrocode} +% +% In the foreground `behind' path we render the echelon, below +% element, and draw the frame. +% +% \begin{macrocode} + \behindforegroundpath{% + \n@to@pp@dbg{2}{NATO App6(c) foreground path: + ^^J Echelon: \meaning\natoapp@ech + ^^J Symbol: \meaning\frameshape + ^^J Below: \meaning\natoapp@below + ^^J Frame: \meaning\frameopt} + % +% \end{macrocode} +% +% We check if we have a frame. If not, stop. +% +% \begin{macrocode} + \ifx\frameshape\pgfutil@empty% + \n@to@pp@dbg{2}{NATO App6(c) has no frame shape!}% + \else% +% \end{macrocode} +% +% We want to draw the rest of the symbol as a part of the frame, so we +% expand the \spec{frame} options in a scope. +% +% \begin{macrocode} + + \edef\tmp@opt{[\frameopt]} + \expandafter\scope\tmp@opt +% \end{macrocode} +% +% First thing in this scope is to draw the actual frame. Again, this +% is done via a node with the right shape. Note that we label this +% node as \spec{M}\meta{id} so we way refer to it later on. +% +% \begin{macrocode} + \n@to@pp@dbg{2}{NATO App6(c) inner node `M\id' ===} + \pgfnode{natoapp6c \frameshape}{center}{}{M\id}{\pgfusepath{stroke}} +% \end{macrocode} +% +% If the user gave an echelon, then put that in. Note that echelons +% are limited to predefined values. +% +% \begin{macrocode} + % Put in the echelon + \@ifundefined{natoapp@ech}{}{% + \ifx\natoapp@ech\pgfutil@empty\else% + \def\args{echelon=\natoapp@ech} + \expandafter\wg@pic\args\@endwg@pic% + {natoapp6c/s/}{$(M.north)+(0,1.2*\n@to@pp@e@y)$}{natoapp6c/echelon} + \fi% + } +% \end{macrocode} +% +% If the user want something under the frame, put that in. +% +% \begin{macrocode} + % Put in stuff below main + \@ifundefined{natoapp@below}{}{% + \n@to@pp@belowtrue + \begin{scope} + \wg@pic@all{\natoapp@below}{natoapp6c/s/}{% + $(M.south)+(0,-\n@to@pp@e@yy)$}{% + natoapp6c/below}% + \end{scope}% + \n@to@pp@belowfalse} +% \end{macrocode} +% +% If the \spec{decoy} flag was set, we draw that. +% +% \begin{macrocode} + \ifnatoapp@decoy% + \scope[dash pattern=on 3\pgflinewidth off 2\pgflinewidth]% + \n@to@pp@dbg{1}{Drawing decoy modifier}% + \wg@sub@nchor{M\id}{north east} + \wg@tmpa=\pgf@x% + \wg@tmpb=\pgf@y% + \pgfpathmoveto{\pgfqpoint{\wg@tmpa}{\wg@tmpb}}% + \wg@tmpc=\n@to@pp@e@yy cm% + \advance\wg@tmpc\n@to@pp@e@yy cm% + \advance\wg@tmpc\wg@tmpb% + \pgfpathlineto{\pgfqpoint{0cm}{\wg@tmpc}}% + \pgfpathlineto{\pgfqpoint{-\wg@tmpa}{\wg@tmpb}}% + \pgfusepath{stroke}% + \endscope% + \fi% + \endscope% + \fi% + } +} +% \end{macrocode} +% +% That finished the shape for NATO App6(c) symbols. We could stop +% here, but for convenience we define a wrapper macro. +% +% \end{NatoAppFrame} +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% \subsubsection{The \cs{natoapp} wrapper macro} +% +% \begin{Macro}{\natoapp} +% +% This is a wrapper macro for inserting a node with a NATO App6(c) +% symbol in it. The syntax of the macro is +% +% \begin{Syntax} +% \cs{natoapp}\oarg{natoapp6c options}\parg{position}\parg{identifier}; +% \end{Syntax} +% +% Note that the trailing semi-colon (\spec{;}) is optional. +% +% This macro forwards to \cs{n@toapp}. +% +% \begin{macrocode} +\newcommand\natoapp[1][]{% + \n@to@pp@dbg{2}{NATO App6(c) macro -> `#1'} + \tikzset{/natoapp6c/.cd,faction=friendly,command=land}% + \@ifnextchar({\n@toapp{#1}}{\n@toapp{#1}(0,0)}%) +} +% \end{macrocode} +% \end{Macro} +% +% \begin{Macro}{\n@toapp} +% +% This macro takes care to parse the location argument --- if any. +% It forwards to \cs{n@to@pp}. +% +% \begin{macrocode} +\def\n@toapp#1(#2){% + \n@to@pp@dbg{2}{NATO App6(c) second macro -> `#1', `#2'} + \@ifnextchar({\n@to@pp{#1}{#2}}{\n@to@pp{#1}{#2}()}%) +} +% \end{macrocode} +% \end{Macro} +% +% +% \begin{Macro}{\n@to@pp} +% This is the main work-horse of the wrapper. It makes a node with +% the shape \spec{natoapp6c} passing the relevant parameters. The +% syntax of the macro is +% +% \begin{macrocode} +\def\n@to@pp#1#2(#3){% + %\let\name\pgfutil@empty% + %\ifx|#3|\else\edef\name{(#3)}\fi% + %\n@to@pp@dbg{3}{Arguments: #1}% + %\edef\args{[natoapp6c={#1},transform shape] \name at (#2) {}} + %\expandafter\node\args;% + \node[draw,transform shape,natoapp6c={#1}] (#3) at (#2) {};% + \@ifnextchar;{\@gobble}{}} +% \end{macrocode} +% \end{Macro} +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% \subsubsection{Macros for markings} +% +% \begin{Macro}{\natoappmark} +% +% A macro for making NATO App6(c) markings. +% +% \begin{macrocode} +\providecommand\natoappmark[2][]{% + \tikz[scale=.25,#1]{\natoapp[faction=friendly,command=land,main=#2]}} +% \end{macrocode} +% \end{Macro} +% +% \begin{Macro}{\echelonmark} +% \begin{macrocode} +\providecommand\echelonmark[2][]{\tikz[scale=.5,#1]{% + \pic[scale line widths,line width=1pt] {natoapp6c/s/echelon=#2};}} +% \end{macrocode} +% \end{Macro} +% +% Some specific NATO App6(c) markers. +% +% \begin{macrocode} +\DeclareRobustCommand\armouredmark[1][]{\natoappmark[#1]{armoured}} +\DeclareRobustCommand\infantrymark[1][]{\natoappmark[#1]{infantry}} +\DeclareRobustCommand\artillerymark[1][]{% + \natoappmark[#1]{{[fill=pgfstrokecolor]artillery}}} +\DeclareRobustCommand\combinedmark[1][]{\natoappmark[#1]{combined arms}} +\DeclareRobustCommand\pgmark[1][] {\natoappmark[#1]{{armoured,infantry}}} +\DeclareRobustCommand\reconnaissancemark[1][]{\natoappmark[#1]{reconnaissance}} +\DeclareRobustCommand\corpsmark[1][]{\natoappmark[#1]{,echelon=corps}} +\DeclareRobustCommand\divisionmark[1][]{\natoappmark[#1]{,echelon=division}} +\DeclareRobustCommand\brigademark[1][] {\natoappmark[#1]{,echelon=brigade}} +\DeclareRobustCommand\regimentmark[1][]{\natoappmark[#1]{,echelon=regiment}} +\DeclareRobustCommand\sofmark[1][] {\natoappmark[#1]{{infantry,text=SOF}}} +\DeclareRobustCommand\mountaineermark[1][]{% + \natoappmark[#1]{infantry,lower=mountain}} +\DeclareRobustCommand\airbornemark[1][]{% + \natoappmark[#1]{infantry,lower=airborne}} +\DeclareRobustCommand\amphibiousmark[1][]{\natoappmark[#1]{,lower=amphibious}} +\DeclareRobustCommand\airassaultmark[1][]{% + \natoappmark[#1]{infantry,upper=air assault}} +% \end{macrocode} +% \iffalse +% </natoapp6c> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/natoapp6c/symbols.dtx b/macros/latex/contrib/wargame/source/natoapp6c/symbols.dtx new file mode 100644 index 0000000000..19b41da5cf --- /dev/null +++ b/macros/latex/contrib/wargame/source/natoapp6c/symbols.dtx @@ -0,0 +1,3165 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*natoapp6c> +% \fi +% \subsubsection{The symbols} +% +% Next, we define all the symbols. Note that we define them all as if +% they are in the \spec{main} section of the symbol, since \spec{top}, +% \spec{bottom}, and \spec{below} symbols are automatically scaled. +% +% \begin{NatoAppSymbol}{natoapp6c/s/above corps support} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/above corps support/.pic={% + \edef\n@toapp@path{\n@toapp@corps@support{\natoapp@fac}} + \expandafter\path[draw] \n@toapp@path; + \expandafter\path[draw,xscale=-1] \n@toapp@path;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/air assault with organic lift} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/air assault with organic lift/.pic={% + \ifx\n@to@pp@hostile\natoapp@fac% + \def\n@toapp@path{(-.75,-.2)--(-.15,-.2)--(0,-.5)--(.15,-.2)--(.75,-.2)} + \else + \def\n@toapp@path{(-.75,-.2)--(-.1,-.2)--(0,-.325)--(.1,-.2)--(.75,-.2)} + \fi + \path[draw] \n@toapp@path;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/air decoy} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/air decoy/.pic={% + \pic[pic actions]{natoapp6c/s/decoy}; + \path[fill=pgfstrokecolor,pic actions] (0.4, -0.2) rectangle (-0.4, -0.15);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/air assault} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/air assault/.pic={% + \path[draw] ([shift={(150:.4)}]0,-.1)--(0,-.1)--([shift={(30:.4)}]0,-.1);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/air defence} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/air defence/.pic={% + \ifx\natoapp@fac\n@to@pp@friendly% + \def\n@toapp@opt{[out=90,in=90,looseness=.675]}% + \else\ifx\natoapp@fac\n@to@pp@neutral% + \def\n@toapp@opt{[out=90,in=90,looseness=1]}% + \else% + \def\n@toapp@opt{[out=45,in=135,looseness=1.5]}% + \fi\fi% + \edef\n@toapp@path{(M.south west) to\n@toapp@opt (M.south east)} + \path[draw] \n@toapp@path;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/air strip} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/air strip/.pic={% + \path[fill=pgfstrokecolor] (-.4,-.1) rectangle(.4,0); + \path[rotate=45,fill=pgfstrokecolor] (-.4,0) rectangle (.4,.1); + } +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/air traffic} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/air traffic/.pic={ + \path[fill=pgfstrokecolor] + (0.33,0.21)-- + (0.33, -0.21)-- + (-0.33, 0.21)-- + (-0.33,-0.21)-- + cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/airship} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/airship/.pic={% + % \path (0.45, 0.175) rectangle (-0.45, -0.175); + \path[pic actions] (0, 0) ellipse (0.45 and 0.15); + \begin{scope} + \clip (0, 0) ellipse (0.45 and 0.15) [reverseclip]; + \path[pic actions] + (0.2,0)--(0.3,0.175)--(0.4,0.175)--(0.375,0) + --(0.4,-0.175)--(0.3, -0.175)--cycle; + \end{scope}}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/airborne} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/airborne/.pic={% + \ifx\n@to@pp@neutral\natoapp@fac% + \draw (0,-0.05) arc(0:180:0.15); + \draw (0,-0.05) arc(180:0:0.15); + \else% + \draw (0,-0.05) arc(0:180:0.2); + \draw (0,-0.05) arc(180:0:0.2); + \fi}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/ammunition} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/ammunition/.pic={\path[draw] + (0.175,-0.175)--(-0.175,-0.175) + (0.125,-0.175)--(0.125, 0) to[out=90,in=90,looseness=2.75] + (-0.125, 0)--(-0.125, -0.175);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/amphibious} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/amphibious/.pic={ + \def\n@to@pp@tmp{0} + \ifn@to@pp@below\def\n@to@pp@tmp{-.1}\fi + \ifn@to@pp@mod + \path[draw,shift={(0,\n@to@pp@tmp)}](1.21,0) + to[out=-90,in=-90, looseness=2.25] (1.05, 0) + to[out= 90,in= 90, looseness=2.25] (0.89, 0) + to[out=-90,in=-90, looseness=2.25] (0.73, 0) + to[out= 90,in= 90, looseness=2.25] (0.57, 0) + to[out=-90,in=-90, looseness=2.25] (0.41, 0) + to[out= 90,in= 90, looseness=2.25] (0.25, 0) + to[out=-90,in=-90, looseness=2.25] (0.08, 0) + to[out= 90,in= 90, looseness=2.25] (-0.08, 0) + to[out=-90,in=-90, looseness=2.25] (-0.25, 0) + to[out= 90,in= 90, looseness=2.25] (-0.41, 0) + to[out=-90,in=-90, looseness=2.25] (-0.57, 0) + to[out= 90,in= 90, looseness=2.25] (-0.73, 0) + to[out=-90,in=-90, looseness=2.25] (-0.89, 0) + to[out= 90,in= 90, looseness=2.25] (-1.05, 0) + to[out=-90,in=-90, looseness=2.25] (-1.21, 0) + \else + \path[draw,shift={(0,\n@to@pp@tmp)}](0.73, 0) + to[out= 90,in= 90, looseness=2.25] (0.57, 0) + to[out=-90,in=-90, looseness=2.25] (0.41, 0) + to[out= 90,in= 90, looseness=2.25] (0.25, 0) + to[out=-90,in=-90, looseness=2.25] (0.08, 0) + to[out= 90,in= 90, looseness=2.25] (-0.08, 0) + to[out=-90,in=-90, looseness=2.25] (-0.25, 0) + to[out= 90,in= 90, looseness=2.25] (-0.41, 0) + to[out=-90,in=-90, looseness=2.25] (-0.57, 0) + to[out= 90,in= 90, looseness=2.25] (-0.73, 0) + \fi + ; + }, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/amphibious warfare ship} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/amphibious warfare ship/.pic={ + \pic{natoapp6c/s/warfare vessel}; + \path[draw,fill=pgfstrokecolor] + (0.15, 0.05) -- + (0.15, 0.2) -- + (-0.15, 0.2) -- + (-0.15, 0.05) -- cycle + (0, -0.2) rectangle (0.25, -0.175);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/analysis} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/analysis/.pic={ + \path[pic actions] + (-0.3,-0.2)--(0.3,-0.2)--(0, -0.4)--cycle (0,-0.2)--(0,0.4);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/arrest} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/arrest/.pic={ + \path[pic actions] circle(0.2); + \pic[scale=.8]{natoapp6c/s/individual};}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/artillery} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/artillery/.pic={ + \path[pic actions] circle(0.2);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/anti tank anti armour} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/anti tank anti armour/.pic={% + \ifx\natoapp@fac\n@to@pp@unknown% + \path[draw,pic actions] (225:.5)--(M.north)--(315:.5); + \else% + \path[draw,pic actions] (M.south west)--(M.north)--(M.south east);% + \fi}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/antenna} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/antenna/.pic={\path[draw] + (0, -0.3) -- (0, 0.3) (-0.125, 0.3) -- (0, 0.2) -- (0.125, 0.3);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/armoured} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/armoured/.pic={\path[draw] + (-0.275,0.2) arc(90:270:0.2)--(0.275, -0.2) arc(270:450:0.2)--cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/armoured fighting vehicle} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/armoured fighting vehicle/.pic={ + \path[fill=pgfstrokecolor] (-.4,-.2) rectangle (-.3,.2) (.3,-.2) rectangle (.4,.2); + \path[pic actions] (-.3,0) -- (0,.2) -- (.3,0) -- (0,-.2) -- cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/armoured personnel carrier} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/armoured personnel carrier/.pic={ + \pic[sub pic actions,draw]{natoapp6c/s/vehicle}; + \path[pic actions] (.35,.15)--(0,.3)--(-.35,.15);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/arctic} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/arctic/.pic={ + \draw (-0.325,0.135) arc(180:270:0.075 and 0.15) -- + +(0.5, 0) arc(-90:0:0.075 and 0.15);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/automobile} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/automobile/.pic={ + \begin{scope} + \clip (0.2,-0.15) circle(0.05) (-0.2,-0.15) circle(0.05) [reverseclip]; + \path[pic actions] + (0.3, -0.15) -- + (-0.3, -0.15) -- + (-0.3, 0.025) -- + (-0.1, 0.025) -- + (-0.1, 0.2) -- + ( 0.1, 0.2) -- + ( 0.1, 0.025) -- + ( 0.3, 0.025) -- cycle + ( 0.075, 0.025) rectangle (-0.075, 0.175); + \end{scope} + \path[pic actions] + ( 0.2, -0.15) circle (0.05) + (-0.2, -0.15) circle (0.05); + }, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/balloon} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/balloon/.pic={% + \path[pic actions] (0, 0.025) circle (0.175); + \begin{scope} + \clip (0, 0.025) circle (0.175) [reverseclip]; + \path[pic actions] (-0.05,0) rectangle (0.05,-0.2)--(0.05,0); + \end{scope}}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/bar} +% \begin{macrocode} +\tikzset{ + natoapp6c/s/bar/.pic={ + \path[fill=pgfstrokecolor] (-.3,-.1) rectangle (.3,.1);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/base} +% \begin{macrocode} +\tikzset{ + natoapp6c/s/base/.pic={ + \path[pic actions] circle(.2); + \path[pic actions] + (-.2,0) -- (.2,0) + ( 0,-.2) -- (0 ,.2) + (225:.2) -- (45:.2) + (135:.2) -- (-45:.2); + } +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/bicycle equipped} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/bicycle equipped/.pic={\draw(0,0) circle(.1);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/boat} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/boat/.pic={ + \path[pic actions] + (-0.2, -0.2) -- + ( 0.2, -0.2) -- + ( 0.35, 0.05) -- + (-0.15, 0.05) -- + (-0.075, 0.2) -- + (-0.175, 0.2) -- + (-0.25, 0.05) -- + (-0.35, 0.05) -- + cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/booby trap} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/booby trap/.pic={ + \path[draw] (0, -0.2) ellipse(0.2 and 0.065); + \begin{scope} + \clip (0, -0.2) ellipse(0.2 and 0.065) [reverseclip]; + \path[draw] (-0.2, -0.2) -- (0, 0.2) -- (0.2, -0.2); + \end{scope}}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/bottomed} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/bottomed/.pic={ + \path[draw,fill=pgfstrokecolor] (-0.33,.1) rectangle(0.33,.2);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/bridge} +% \begin{macrocode} +\tikzset{% + pics/natoapp6c/s/bridge/.is choice, + pics/natoapp6c/s/bridge/none/.style={ + code={\path[pic actions] + (0.35,-0.15)--(0.25,-0.05)--(-0.25,-0.05)--(-0.35,-0.15) + (0.35, 0.15)--(0.25, 0.05)--(-0.25, 0.05)--(-0.35, 0.15);}}, + pics/natoapp6c/s/bridge/fixed/.style={ + code={\pic{natoapp6c/s/bridge};\pic{natoapp6c/s/type=vlight};}}, + pics/natoapp6c/s/bridge/folding/.style={ + code={\pic{natoapp6c/s/bridge=none}; + \path[draw] (.1,-.2) -- (-.1,-.2) -- (-.1,.2) -- (.1,.2);}}, + pics/natoapp6c/s/bridge/hollow/.style={ + code={\pic{natoapp6c/s/bridge=none}; + \path[draw] (.1,-.2) -- (-.1,-.2) -- (-.1,.2) -- (.1,.2) -- cycle;}}, + pics/natoapp6c/s/bridge/.default=none, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/capsule} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/capsule/.pic={ + \path[pic actions] + ($(0.25, -0.2)!0.1!(0, 0.5)$) -- + ($(0.25, -0.2)!0.5!(0, 0.5)$) to[in=75, out=105, looseness=0.75] + ($(0, 0.5)!0.5!(-0.25, -0.2)$) -- + ($(0, 0.5)!0.9!(-0.25, -0.2)$) to[in=285, out=255, looseness=0.55] + cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/carrier} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/carrier/.pic={ + \pic{natoapp6c/s/warfare vessel}; + \path[draw,fill=pgfstrokecolor] + (-0.15, 0.05) -- + (-0.15, 0.2) -- + (-0.3, 0.2) -- + (-0.3, 0.05) -- cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/chemical biological radiological nuclear} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/chemical biological radiological nuclear/.pic={ + \path[draw,fill=pgfstrokecolor] (-0.29,0.1) circle(0.096) (0.29,0.1) circle(0.096); + \path[pic actions] (0.15,-0.2) arc(0:90:0.45 and 0.375) + (-0.15,-0.2) arc(180:90:0.45 and 0.375);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/civilian military cooperation} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/civilian military cooperation/.pic={% + \path[draw] (.375,.2)--(-.375,.2)--(-.375,-.025) + to[in=270, out=270, looseness=0.75] (.375,-.025)--cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/civilian police} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/civilian police/.pic={% + \path[draw] (0.225, 0.2) + to[in=270, out=270, looseness=3] (-0.225, 0.2) + to [in=270, out=270, looseness=1.5] (0,0.2) + to [in=270, out=270, looseness=1.5] (0.225, 0.2) -- cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/civilian telecommunications} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/civilian telecommunications/.pic={ + \path[draw] (0.075, -0.2){[line join=bevel] -- (0, 0.1) -- (-0.075, -0.2)} + (0.065, -0.05) -- (-0.065, -0.05) + (-0.325, 0.2) -- (-0.15, 0.125) -- (-0.15, 0.175) -- (0, 0.1) -- (0.15, 0.175) -- (0.15, 0.125) -- (0.325, 0.2); + }, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/coast guard vessel} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/coast guard vessel/.pic={% + \pic[draw] {natoapp6c/s/ship}; + \path[pic actions] (0.15, 0.05) -- (0, -0.2) (0.2, 0.05)--(0.05, -0.2);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/combat support} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/combat support/.pic={% + \path[fill=pgfstrokecolor] + (.15,.2)--(-.15,.2)--(-.15,-.05)--(0,-.2)--(.15,-.05) -- cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/combatant} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/combatant/.pic={% + \begin{scope}[xshift=-4.5, yshift=-5] + \path[pic actions] + (0.3213,0.0534) .. controls (0.3186,0.0295) and (0.3072,0.0136) .. + (0.2925,0.0063) .. controls (0.2777,-0.0010) and (0.2605,0.0001) .. + (0.2461,0.0068) .. controls (0.2317,0.0136) and (0.2198,0.0265) .. + (0.2163,0.0433) .. controls (0.2147,0.0513) and (0.2150,0.0601) .. + (0.2179,0.0694) .. controls (0.1304,0.1129) and (0.0223,0.1961) .. + (0.0013,0.3209) .. controls (0.0601,0.1809) and (0.1770,0.0912) .. + (0.3213,0.0534) -- cycle + (0.2304,0.0633) .. controls (0.2287,0.0570) and (0.2287,0.0513) .. + (0.2298,0.0461) .. controls (0.2323,0.0340) and (0.2409,0.0245) .. + (0.2520,0.0193) .. controls (0.2630,0.0141) and (0.2760,0.0135) .. + (0.2864,0.0186) .. controls (0.2932,0.0220) and (0.2992,0.0277) .. + (0.3033,0.0370) .. controls (0.2845,0.0413) and (0.2597,0.0498) .. + (0.2304,0.0633) -- cycle + (0.1785,0.1137) .. controls (0.2446,0.1612) and (0.3061,0.2300) .. + (0.3214,0.3209) .. controls (0.2864,0.2377) and (0.2310,0.1723) .. + (0.1614,0.1249) + (0.1443,0.1138) .. controls (0.1011,0.0871) and (0.0530,0.0670) .. + (0.0014,0.0535) .. controls (0.0041,0.0295) and (0.0154,0.0136) .. + (0.0302,0.0063) .. controls (0.0449,-0.0010) and (0.0621,0.0001) .. + (0.0765,0.0069) .. controls (0.0909,0.0137) and (0.1028,0.0265) .. + (0.1063,0.0433) .. controls (0.1079,0.0513) and (0.1076,0.0602) .. + (0.1047,0.0694) .. controls (0.1230,0.0785) and (0.1422,0.0893) .. + (0.1613,0.1019) + (0.0928,0.0461) .. controls (0.0903,0.0340) and (0.0816,0.0245) .. + (0.0706,0.0193) .. controls (0.0596,0.0141) and (0.0466,0.0135) .. + (0.0362,0.0186) .. controls (0.0294,0.0220) and (0.0234,0.0277) .. + (0.0193,0.0370) .. controls (0.0381,0.0413) and (0.0629,0.0498) .. + (0.0921,0.0633) -- + (0.0921,0.0633) .. controls (0.0938,0.0570) and (0.0938,0.0512) .. + (0.0928,0.0461) -- cycle; + \end{scope} + }, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/combined arms} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/combined arms/.pic={% + \path[draw] pic {natoapp6c/s/armoured}; + \path[draw] (0.275, 0.2) -- (-0.275, -0.2) (0.275, -0.2) -- (-0.275, 0.2);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/computer system} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/computer system/.pic={ + \path[draw,fill=pgfstrokecolor,pic actions] + (-.3, .28) rectangle ( .3, .3) + (-.3, -.18) rectangle ( .3, -.2) + (-.3, -.18) rectangle (-.3, .28) + ( .3, -.18) rectangle ( .3, .28) + (-.3, -.3) rectangle ( .3, -.28) + (-.05,-.28) rectangle ( .05,-.18);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/control} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/control/.pic={ + \path[pic actions] + [{Stealth[inset=0pt,scale=0.5]}-{Stealth[inset=0pt,scale=0.5]}] + (0, .2) -- (0, -.2); + \path[pic actions] + [{Stealth[inset=0pt,scale=0.5]}-{Stealth[inset=0pt,scale=0.5]}] + (-.2, 0) -- (.2, 0);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/convoy} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/convoy/.pic={ + \path[draw,fill=pgfstrokecolor] + (0.35, 0.175) -- + (-0.35, 0.175) -- + (-0.35, -0.175) -- + (-0.2, -0.175) -- + (-0.2, 0.025) -- + (0.2, 0.025) -- + (0.2, -0.175) -- + (0.35, -0.175) -- cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/corps support} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/corps support/.pic={% + \edef\n@toapp@path{\n@toapp@corps@support{\natoapp@fac}} + \expandafter\path[draw] \n@toapp@path;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/crime} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/crime/.pic={\path[draw,dashed] (-.45,.25)--(.45,-.25);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/decoy} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/decoy/.pic={% + \path[fill=pgfstrokecolor,draw,yshift=1.5] + (0.2, 0) -- (0.4, 0.15) -- (0.4, -0.15) -- cycle + (-0.1, 0) -- (0.1, 0.15) -- (0.1, -0.15) -- cycle + (-0.4, 0) -- (-0.2, 0.15) -- (-0.2, -0.15) -- cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/direct communications} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/direct communications/.pic={ + \path[draw] (-.35,0) circle(.1) (.35,0) circle(.1); + \pic[fill=pgfstrokecolor]{natoapp6c/s/intermodal}; + }, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/direction finding} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/direction finding/.pic={% + \path[draw] (-.3,.2)--(0,.4)--(.3,.2) (0,.4)--(0,-.4);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/diving} +% \begin{macrocode} +\tikzset{% + pics/natoapp6c/s/diving/.is choice, + pics/natoapp6c/s/diving/none/.style={ + code={ + \path[pic actions] (0,0) circle(.1) (0,0) circle(.25); + \begin{scope} + \clip (0,0) circle(.25) [reverseclip]; + \path[pic actions] (-.3,-.1) rectangle(.3,.1) + (0,0) -- (-45:.4) -- (-135:.4) -- cycle; + \end{scope}}}, + pics/natoapp6c/s/diving/military/.style={ + code={ + \begin{scope}[even odd rule] + \clip (0,0) circle(0.1)[reverseclip]; + \pic[fill=pgfstrokecolor]{natoapp6c/s/diving=none}; + \end{scope} + \path[fill=pgfstrokecolor] (0,0) circle(0.08); + }}, + pics/natoapp6c/s/diving/.default=none, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/drilling} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/drilling/.pic={\path[fill=pgfstrokecolor] + (-0.1,-0.2) -- (0.1,-0.2) -- (0.2, 0.2) -- (-0.2, 0.2) -- cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/earthmover} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/earthmover/.pic={ + \pic{natoapp6c/s/tank}; + \path[pic actions] (.3, + .3)--(.175,.35)--(-.175,.35)--(-.3,.3) + (0,.2)--(0,.35); + }, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/electric power} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/electric power/.pic={ + \path[pic actions] + (-0.05, 0) .. controls(-0.06, 0.14) .. + ( 0, 0.09) .. controls( 0.03, 0.06) .. + ( 0, 0.06) .. controls(-0.03, 0.06) .. + ( 0, 0.09) .. controls( 0.06, 0.14) .. + (0.05, 0) + ($(-55:0.125) + (0, 0.075)$) arc(-55:235:0.125) arc(415:360:0.05) -- + +(0, -0.08) arc(180:360:0.05035) -- + +(0, 0.08) arc(180:125:0.05) -- cycle; + }, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/electronic ranging} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/electronic ranging/.pic={% + \path[draw] (135:.225) arc (135:315:.225)--cycle (0,0)--(225:-.225);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/electronic warfare wide} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/electronic warfare wide/.pic={% + % OBS + \node[natoapp6c/text,natoapp6c/normal text] at(-.25,0){E}; + \node[natoapp6c/text,natoapp6c/normal text] at(.25,0){W}; + }, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/engineer} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/engineer/.pic={\path[draw] + (.4,-.2)--(.4,.2)--(-.4,.2)--(-.4,-.2) (0,.2)--(0,-.2);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/enhanced location reporting system} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/enhanced location reporting system/.pic={\path[draw] + (0, -0.3) -- (0, 0.3) (-0.2, -.3) -- (0, 0.-.1) -- (0.2, -.3);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/environmental protection} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/environmental protection/.pic={% + \path[draw] (0, 0.2) + -- (0.1, 0.05) + -- (0.05, 0.05) + -- (0.15, -0.05) + -- (0.1, -0.05) + -- (0.2, -0.15) + -- (0.15, -0.15) + -- (0.05, -0.15) + -- (0.05, -0.2) + -- (-0.05, -0.2) + -- (-0.05, -0.15) + -- (-0.2, -0.15) + -- (-0.1, -0.05) + -- (-0.15, -0.05) + -- (-0.05, 0.05) + -- (-0.1, 0.05) + -- cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/explosion} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/explosion/.pic={% + \node [shape=rectangle, + starburst, + draw, + minimum width=0.9cm, + minimum height=0.9cm, + starburst point height=0.25cm, + starburst points=12] {};}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/finance} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/finance/.pic={% + \path[draw] (-.3,-.25) rectangle(.3,0) + (-.3,0) -- ++(60:.28) -- ([shift=(120:.28)].3,0) -- (.3,0);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/fishing vessel} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/fishing vessel/.pic={ + \path[pic actions] + (-0.15, -0.2) -- + ( 0.15, -0.2) -- + ( 0.25, 0.025) -- + (-0.05, 0.025) -- + (-0.05, 0.125) -- + (-0.2, 0.125) -- + (-0.2, 0.025) -- + (-0.25, 0.025) -- cycle + (0.025, 0.025) -- (0.025, 0.2) + (0.025, 0.025) -- +(45:0.2);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/fire protection} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/fire protection/.pic={% + \path[fill=pgfstrokecolor] (0,0) circle(.2) + (0,0) -- (60:.3) -- (120:.3) -- cycle + (0,0) -- (-30:.3) -- (30:.3) -- cycle + (0,0) -- (150:.3) -- (210:.3) -- cycle + (0,0) -- (240:.3) -- (300:.3) -- cycle; + }, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/fixed and rotary wing} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/fixed and rotary wing/.pic={% + \path[xscale=.45,yscale=.75,pic actions] pic {natoapp6c/s/fixed wing}; + \path[yscale=.45,xscale=.7,rotate=90, pic actions] pic { + natoapp6c/s/rotary wing}; + }, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/fixed wing} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/fixed wing/.pic={ + \path[pic actions] + (-0.36,0.125) arc (77:275:0.075 and 0.125) -- (0,0) -- cycle + ( 0.36,0.125) arc (-275:-77:-0.075 and 0.125) -- (0,0) + --cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/flame thrower} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/flame thrower/.pic={ + \path[pic actions] + (-0.1, -0.4) -- (-0.1, 0.3) to[out=90,in=90,looseness=2] + (0.1, 0.3) -- (0.1, 0.275);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/floating} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/floating/.pic={ + \path[draw] + (-0.5, 0.100) -- + (-0.417, 0.242) -- + (-0.333, 0.100) -- + (-0.250, 0.242) -- + (-0.167, 0.100) -- + (-0.083, 0.242) -- + (0.0, 0.100) -- + (0.083, 0.242) -- + (0.167, 0.100) -- + (0.250, 0.242) -- + (0.333, 0.100) -- + (0.417, 0.242) -- + (0.5, 0.100);}, + pics/natoapp6c/s/surfaced/.style=natoapp6c/s/floating, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/food} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/food/.pic={ + \path[pic actions] + (0.075, 0.2) to[out=210, in=150, looseness=1] + (0.075, -0.2) to[out=180, in=180, looseness=1.5] + (0.075, 0.2) -- cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/fuel} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/fuel/.pic={ + \path[draw] (0,0) -- (135:.3) -- (45:.3) -- cycle (0,0) -- (0,-.3);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/grenade launcher} +% \begin{macrocode} +\tikzset{% + pics/natoapp6c/s/grenade launcher/.is choice,% + pics/natoapp6c/s/grenade launcher/none/.style={% + code={% + \pic[draw]{natoapp6c/s/rifle}; + \pic[draw]{natoapp6c/s/weapon=grenade launcher};}},% + pics/natoapp6c/s/grenade launcher/non lethal/.style={ + code={% + \pic[draw]{natoapp6c/s/non lethal weapon}; + \pic[draw]{natoapp6c/s/weapon=grenade launcher};}}, + pics/natoapp6c/s/grenade launcher/.default=none, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/graffiti} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/graffiti/.pic={ + \path[pic actions] + (0.05, 0.2) + arc (90:270:0.05) + arc (450:270:0.05) + arc (90:270:0.05) + arc (450:270:0.05) + (-0.05, 0.2) + arc (90:270:0.05) + arc (450:270:0.05) + arc (90:270:0.05) + arc (450:270:0.05);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/group} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/group/.pic={ + \path(-.23,.05) pic [draw,scale=.8] {natoapp6c/s/individual}; + \path(0,-.05) pic [draw,scale=.8] {natoapp6c/s/individual}; + \path(.23,.05) pic [draw,scale=.8] {natoapp6c/s/individual};}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/gun} +% \begin{macrocode} +\tikzset{% + pics/natoapp6c/s/gun/.is choice, + pics/natoapp6c/s/gun/base/.style={ + code={ + \pic[draw]{natoapp6c/s/weapon=base}; + \pic[draw]{natoapp6c/s/weapon=top}; + \pic[draw]{natoapp6c/s/weapon=multi fire};}}, + pics/natoapp6c/s/gun/air defence/.style={ + code={ + \pic[draw]{natoapp6c/s/gun/base}; + \pic[draw]{natoapp6c/s/weapon=air defence};}}, + pics/natoapp6c/s/gun/anti tank/.style={ + code={ + \pic[draw]{natoapp6c/s/gun/base}; + \pic[draw]{natoapp6c/s/weapon/anti tank};}}, + pics/natoapp6c/s/gun/direct/.style={ + code={ + \pic[draw]{natoapp6c/s/gun/base}; + \pic[draw]{natoapp6c/s/weapon=bottom};}}, + pics/natoapp6c/s/gun/recoilless/.style={ + code={ + \pic[draw]{natoapp6c/s/rifle}; + \pic[yshift=-4,draw]{natoapp6c/s/weapon=multi fire};}}, + pics/natoapp6c/s/gun/.default=direct, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/headquarters} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/headquarters/.pic={ + \path[pic actions] (M.north west) -- ++(0,-.3) -- + ([shift=(-90:.3)]M.north east) -- (M.north east) -- cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/house} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/house/.pic={ + \path[pic actions] + (-.125,-.175) rectangle (.125,.075) + (-.167,.075) -- (0,.225) -- (.167,.075) -- cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/howitzer} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/howitzer/.pic={ + \pic[draw]{natoapp6c/s/weapon=base}; + \pic[draw]{natoapp6c/s/weapon=top}; + \pic[draw]{natoapp6c/s/weapon=multi fire}; + \pic[yshift=-8,draw]{natoapp6c/s/weapon=grenade launcher}; + }, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/in position} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/in position/.pic={ + \path[draw,fill=pgfstrokecolor] + (-.3,-.01) rectangle (-.2,.01) (.2,-.01) rectangle (.3,.01);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/individual} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/individual/.pic={ + \path[pic actions] + (0,.08) -- (0,-.3) (-.15,0) -- (.15,0) (0,.18) circle(.1);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/infantry} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/infantry/.pic={ + \path[draw] (-.75,.5) -- (.75,-.5) (-.75,-.5) -- (.75,.5);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/intermodal} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/intermodal/.pic={ + \path[pic actions] + ( 0.15, 0.025) -- + (-0.15, 0.025) -- + (-0.15, 0.075) -- + (-0.25, 0) -- + (-0.15, -0.075) -- + (-0.15, -0.025) -- + ( 0.15, -0.025) -- + ( 0.15, -0.075) -- + ( 0.25, 0) -- + ( 0.15, 0.075) -- cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/jagged wave} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/jagged wave/.pic={ + \draw (0.3, -0.05) -- + (0.2, 0.05) -- + (0.1, -0.05) -- + (0, 0.05) -- + (-0.1, -0.05) -- + (-0.2, 0.05) -- + (-0.3, -0.05);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/jam} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/jam/.pic={% + \path[draw] + (0.75, 0) + to[out=90, in=90, looseness=2.25] ( 0.65, 0) + to[out=-90,in=-90,looseness=2.25] ( 0.55, 0) + to[out=90, in=90, looseness=2.25] ( 0.45, 0) + to[out=-90,in=-90,looseness=2.25] ( 0.35, 0) + to[out=90, in=90, looseness=2.25] ( 0.25, 0) + to[out=-90,in=-90,looseness=2.25] ( 0.15, 0) + to[out=90, in=90, looseness=2.25] ( 0.05, 0) + to[out=-90,in=-90,looseness=2.25] (-0.05, 0) + to[out=90, in=90, looseness=2.25] (-0.15, 0) + to[out=-90,in=-90,looseness=2.25] (-0.25, 0) + to[out=90, in=90, looseness=2.25] (-0.35, 0) + to[out=-90,in=-90,looseness=2.25] (-0.45, 0) + to[out=90, in=90, looseness=2.25] (-0.55, 0) + to[out=-90,in=-90,looseness=2.25] (-0.65, 0) + to[out=90, in=90, looseness=2.25] (-0.75, 0) + ;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/jamming} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/jamming/.pic={% + \path(0,.4) pic {natoapp6c/s/jam} (0,.26) pic {natoapp6c/s/jam};}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/jetski} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/jetski/.pic={ + \path[pic actions] + ( 0.3, -0.2) -- + (-0.3, -0.2) -- + (-0.35,-0.1) -- + (-0.1, 0.2) -- + ( 0, 0.2) -- + ( 0, 0.1) -- + (-0.05, 0.1) -- + (-0.1, -0.05) -- + ( 0.3, -0.05) -- + ( 0.3, -0.2) -- cycle; +}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/killing} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/killing/.pic={\path[draw] (-.45,.25)--(.45,-.25);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/labour} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/labour/.pic={% + \path[draw] (-.15,.2) -- (.15,.2) (0,.2) -- (0,0) + (-.15,0) -- ++(300:.3) -- ++(60:.3) -- cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/land mine} +% \begin{macrocode} +\tikzset{% + pics/natoapp6c/s/land mine/.is choice, + pics/natoapp6c/s/land mine/personnel/.style={ + code={\pic[fill=pgfstrokecolor]{natoapp6c/s/land mine=none}; + \path[pic actions] (135:0.35) -- (0, 0) -- (45:0.35);}}, + pics/natoapp6c/s/land mine/tank/.style={ + code={\pic[fill=pgfstrokecolor]{natoapp6c/s/land mine=none};}}, + pics/natoapp6c/s/land mine/none/.style={ + code={\path[pic actions] (0,0) circle(0.25);}}, + pics/natoapp6c/s/land mine/.default=none, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/land missile} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/land missile/.pic={\pic{natoapp6c/s/missile launcher};}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/laser} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/laser/.pic={ + \path[draw,line join=round,line cap=round,pic actions] + ( 0.1, -0.25) -- + (-0.1, -0.225) -- + ( 0.1, -0.2) -- + (-0.1, -0.175) -- + ( 0.1, -0.15) -- + ( 0, -0.1375) -- + ( 0, -0.0125) -- + (-0.1, 0) -- + ( 0.1, 0.025) -- + (-0.1, 0.05) -- + ( 0.1, 0.075) -- + ( 0, 0.0875) -- + ( 0, 0.25) + ( 0.1, 0.2) -- + ( 0, 0.25) -- + (-0.1, 0.2);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/launcher} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/launcher/.pic={ + \path[draw] (-.3,-.2) -- (.3,.2) -- (.3,-.2);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/laundry} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/laundry/.pic={% + \path[draw] (0,-.3) -- (0,.1) + (0,.1) -- ++(150:.25) + (0,.1) -- ++(180:.2) + (0,.1) -- ++(210:.25);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/machine gun} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/machine gun/.pic={% + \pic[draw]{natoapp6c/s/rifle}; + \pic[draw]{natoapp6c/s/weapon=machine gun};}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/main gun} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/main gun/.pic={ + \path[pic actions] (M.north west) -- ++(.25,0) -- + ([shift=(0:.25)]M.south west) -- (M.south west) -- cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/maintenance} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/maintenance/.pic={ + \path[fill=pgfstrokecolor] + (-.38,.25) + to[out=0,in=90,looseness=1.5] (-.2,.05) -- (.2,.05) + to [out=90,in=180,looseness=1.5] (.38,.25) -- ++(0,-.08) + to [out=180,in=90,looseness=1.5] (.28,0) + to [out=-90,in=180,looseness=1.5] (.38,-.17) -- ++(0,-.08) + to [out=180,in=-90,looseness=1.5] (.2,-.05) -- (-.2,-.05) + to [out=-90,in=0,looseness=1.5] (-.38,-.25) -- ++(0,.08) + to [out=0,in=-90,looseness=1.5] (-.28,0) + to [out=90,in=0,looseness=1.5] (-.38,.17) -- cycle; + }, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/medic} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/medic/.pic={ + \path[pic actions] + (-0.075,-0.2) + --(0.075,-.2) + --(.075,-.075) + --(.2,-.075) + --(.2,.075) + --(.075,.075) + --(.075,.2) + --(-0.075,.2) + --(-0.075,.075) + --(-.2,.075) + --(-.2,-.075) + --(-.075,-.075) + --cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/medical} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/medical/.pic={\path[draw] (-1,0) -- (1,0) (0,-1) -- (0,1);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/medical treatment} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/medical treatment/.pic={ + \path[draw] (0,0) pic {natoapp6c/s/medical} + ([xscale=.5,shift={(0,-.2)}]M.west) -- ([xscale=.5,shift={(0,.2)}]M.west) + ([xscale=.5,shift={(0,-.2)}]M.east) -- ([xscale=.5,shift={(0,.2)}]M.east);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/mine} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/mine/.pic={ + \path[fill=pgfstrokecolor,draw] (0,0) ellipse(.2 and .15) + (0,0) -- ++(60:.3) + (0,0) -- ++(90:.3) + (0,0) -- ++(120:.3) + (0,0) -- ++(240:.3) + (0,0) -- ++(270:.3) + (0,0) -- ++(300:.3) + ;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/mine clearing equipment} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/mine clearing equipment/.pic={ + \path[pic actions] + (0, 0.2) -- (0, 0) -- (0.35, -0.2) -- (-0.35, -0.2) -- (0, 0);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/mine warfare vessel} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/mine warfare vessel/.pic={% + \pic[scale=.8,fill=pgfstrokecolor,yshift=2.5]{natoapp6c/s/sea mine=top half}; + \pic {natoapp6c/s/warfare vessel}; + }, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/missile} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/missile/.pic={% + \path[pic actions,draw] + (0, 0.3) + -- (-0.05, 0.2) + -- (-0.05, -0.2) + -- (-0.125,-0.3) + -- (-0.125,-0.4) + -- (0, -0.265) + -- (0.125,-0.4) + -- (0.125,-0.3) + -- (0.05,-0.2) + -- (0.05,0.2) + -- cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/missile launcher} +% \begin{macrocode} +\tikzset{% + pics/natoapp6c/s/missile launcher/.is choice, + pics/natoapp6c/s/missile launcher/base/.style={ + code={ + \pic[draw]{natoapp6c/s/weapon=base}; + \pic[draw]{natoapp6c/s/weapon=top}; + \pic[draw]{natoapp6c/s/weapon=multi fire}; + \pic[draw]{natoapp6c/s/weapon=missile launcher};}}, + pics/natoapp6c/s/missile launcher/none/.style={ + code={ + \pic[draw]{natoapp6c/s/missile launcher=base}; + \path[pic actions] (-.2,-.2)--(-.2,-.35) (.2,-.2)--(.2,-.35);}}, + pics/natoapp6c/s/missile launcher/air defence/.style={ + code={ + \pic[draw]{natoapp6c/s/missile launcher=none}; + \pic[draw]{natoapp6c/s/weapon=air defence};}}, + pics/natoapp6c/s/missile launcher/anti tank/.style={ + code={ + \pic[draw]{natoapp6c/s/missile launcher=base}; + \pic[draw]{natoapp6c/s/weapon=anti tank};}}, + pics/natoapp6c/s/missile launcher/surface to surface/.style={ + code={% + \pic[draw]{natoapp6c/s/missile launcher=none}; + \pic[draw]{natoapp6c/s/weapon=bottom}; + \pic[draw]{natoapp6c/s/weapon=machine gun}; + }}, + pics/natoapp6c/s/missile launcher/.default=none, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/mobile advisor and support} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/mobile advisor and support/.pic={ + \path[draw] (-.35,0) circle(.1) (.35,0) circle(.1); + \path[draw,fill=pgfstrokecolor,pic actions] + ( 0.15, 0.025) -- + (-0.25, 0.025) -- + (-0.25, -0.025) -- + ( 0.15, -0.025) -- + ( 0.15, -0.075) -- + ( 0.25, 0) -- + ( 0.15, 0.075) -- cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/moored} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/moored/.pic={ + \path[draw] (0,.2) -- (0,-.05) (-.3,-.05) -- (.3,-.05);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/mortar} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/mortar/.pic={ + \path[draw] (0,-.15) circle(.05) (0,.-.1) -- (0,.2) + ([shift=(225:.1)]0,.2) -- (0,.2) -- ([shift=(-45:.1)]0,.2);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/motorized} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/motorized/.pic={\path[draw] (M.north) -- (M.south);}, + pics/natoapp6c/s/motorised/.style={natoapp6c/s/motorized}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/mortuary affairs} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/mortuary affairs/.pic={ + \path[draw] (-.1,-.2) rectangle (.1,.2) + (0,-.17) -- (0,.17) (-.07,.1) -- (.07,.1);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/mountain} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/mountain/.pic={ + \path[draw,fill=pgfstrokecolor] (0,.2) -- ++(-60:.7) -- ++(180:.7) -- cycle; + }, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/naval} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/naval/.pic={ + \def\arrow{(0,0) -- (-.02,0) -- ++(60:.04) -- ++(-60:.04) -- cycle} + \begin{scope}[pic actions] + \path[draw] + (0,.13) circle (.08) (-.2,.04) -- (.2,.04) (0,.04) + -- (0,-.25) (210:.25) arc (210:340:.25); + \path[draw,shift=(210:.25),rotate=30] \arrow; + \path[draw,shift=(340:.25),rotate=-30] \arrow; + \end{scope}}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/navigation} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/navigation/.pic={ + \path[draw] + (.17,-.2) -- (0,.2) -- (-.17,-.2) + ($(-180:.17)+(0,.05)$) arc[radius=.17,start angle=-180,end angle=0];}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/navy task} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/navy task/.pic={ + \path[pic actions] + (-0.25, -0.2) -- (-0.25, 0.1) -- (-0.15, 0.2) + ( 0.25, -0.2) -- ( 0.25, 0.1) -- ( 0.15, 0.2);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/non combatant} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/non combatant/.pic={ + \path[draw,fill=pgfstrokecolor] + (-0.25, -0.2) -- + (-0.25, 0.05) -- + (-0.15, 0.05) -- + (-0.15, 0.2) -- + (0.15, 0.2) -- + (0.15, 0.05) -- + (0.25, 0.05) -- + (0.25, -0.2) -- cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/non lethal weapon} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/non lethal weapon/.pic={% + \pic[draw]{natoapp6c/s/weapon};% + \pic[draw]{natoapp6c/s/weapon=non lethal};}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/nuclear} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/nuclear/.pic={ + \path[fill=pgfstrokecolor,pic actions] (0,0) circle(.05) + (0: .3) arc(0 : 60:.3) -- ( 60:.1) arc( 60: 0: .1) -- cycle + (180:.3) arc(180: 120:.3) -- ( 120:.1) arc( 120: 180:.1) -- cycle + (-60:.3) arc(-60:-120:.3) -- (-120:.1) arc(-120:-60: .1) -- cycle; + }, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/observer} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/observer/.pic={ + \path[pic actions] (0.25,-.2)--(-.25,-.2)--(0,.2)--cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/orbiter shuttle} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/orbiter shuttle/.pic={ + \path[pic actions] + ($(0, 0.3)!0.35!(0.125, -0.15)$) -- + (0.125, -0.15) -- (-0.125, -0.15) -- + ($(-0.125, -0.15)!0.65!(0, 0.3)$) + to[in=105, out=75] cycle + (0, -0.20) -- (0, -0.15); }, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/ordnance} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/ordnance/.pic={ + \path[draw] (0,0) ellipse(.2 and .15); + \begin{scope} + \clip (0,0) ellipse(.2 and .15) [reverseclip]; + \path[draw] (0,0) -- ++(50:.3) + (0,0) -- ++(70:.3) + (0,0) -- ++(110:.3) + (0,0) -- ++(130:.3) + ; + \end{scope}}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/organisation} +% \begin{macrocode} +\tikzset{% + pics/natoapp6c/s/organisation/.style={natoapp6c/s/group}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/over snow} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/over snow/.pic={ + \ifn@to@pp@below% + \draw ([shift={(-.15,.15)}]M.south west) to[in=180, out=270] + ++(.15,-.15) -- (M.south east); + \else% + \draw ([shift={(.3,.1)}]M.west) to[in=180, out=-90] + ([shift={(.5,-.1)}]M.west) -- + ([shift={(-.3,-.1)}]M.east); + \fi}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/pack animal} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/pack animal/.pic={ + \def\n@to@pp@tmp{0} + \ifn@to@pp@below\def\n@to@pp@tmp{-.15}\fi + \path[draw,shift={(0,\n@to@pp@tmp)}] + (-.3,-.15) -- (-.15,.15) -- (0,-.15) -- (.15,.15) -- (.3,-.15);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/patrol} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/patrol/.pic={ + \pic{natoapp6c/s/warfare vessel}; + \path[draw,fill=pgfstrokecolor] (0.125, 0) -- (0, 0.2) -- (-0.125, 0) -- cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/patrolling} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/patrolling/.pic={ + % OBS + \path[draw] + (0.25, 0.05) -- (-0.05, 0.05) -- (0.05, -0.05) -- (-0.4, -0.05) + (-0.3, 0) -- (-0.4, -0.05) -- (-0.3, -0.1) + node [natoapp6c/text,natoapp6c/small text, + scale=.5,anchor=west,inner sep=0] at (0.25, 0.05) {P}; + }, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/physician} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/physician/.pic={ + \pic{natoapp6c/s/medical}; + \path[draw] (0.1, 0.05) -- (-0.1, 0.05);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/pipeline} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/pipeline/.pic={ + \path[draw] (-.15,-.15) rectangle (.15,.15) + (-.3,.1) -- (-.15,.1) (-.3,-.1) -- (-.15,-.1) + (.3,.1) -- (.15,.1) (.3,-.1) -- (.15,-.1) + (-.05,.15) rectangle (.05,.25) (-.1,.25) rectangle (.1,.30);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/poisoning} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/poisoning/.pic={ + \path[pic actions] (0, 0.055) circle (0.145) + (0.3, 0) -- (-0.3, -0.2) + (-0.3, 0) -- (0.3, -0.2);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/postal} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/postal/.pic={ + \path[draw] (-.25,.25) -- (.08,.25) + to [out=-90,in=120,looseness=1] (.25,-.25) + to [out=150,in=-90,looseness=1] (-.25,.25); + }, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/printed media} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/printed media/.pic={ + \path[pic actions] (0.2, 0) -- (-0.2, 0) + (0, 0.1) circle (0.085) + (0, -0.1) circle (0.085);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/psychological} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/psychological/.pic={ + \path[pic actions] (-.25,.15) -- (-.1,.15) -- (.1,.25) + -- ++(0,-.5) -- (-.1,-.15) -- (-.25,-.15) -- cycle + (.1,.15) -- (.25,.15) + (.1,.05) -- (.25,.05) + (.1,-.05) -- (.25,-.05) + (.1,-.15) -- (.25,-.15);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/quarry} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/quarry/.pic={ + \path[draw] (-.2,-.2) -- (.18,.18) (.2,-.2) -- (-.18,.18) + (25:.255) arc(25:65:.255) + (115:.255) arc(115:155:.255); + %([shift={(115:.08)}]-.1,.1) arc (115:155:.08) + %([shift={(70:.08)}].1,.1) arc (70:110:.08); + }, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/quartermaster} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/quartermaster/.pic={ + \path[draw] (-.4,.1) -- (.1,.1) (.25,.1) circle(.15) + (-.3,.1) -- (-.3,-.15) (-.15,.1) -- (-.15,-.15) + (-.3,-.08) -- (-.15,-.08);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/radar} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/radar/.pic={% + \path[draw] (-.2,.2) arc (150:300:.25) (-.24,.01) -- (0,.2) -- + (0,0) -- (.2,.2);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/radio} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/radio/.pic={% + \path[draw] (-.2,.2) -- (-.13,.25) -- (-.07,.2) -- (0,.25) -- + (.07,.2) -- (.13,.25) -- (.2,.2) (0,.25) -- (0,-.05) (0,-.15) circle(.1);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/radio relay} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/radio relay/.pic={% + \path[draw] (-.2,.25) -- (.2,.25) (0,.25) -- (0,-.05) (0,-.15) circle(.1);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/radio relay line of sight} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/radio relay line of sight/.pic={% + \path[draw] (0,0) circle(.2); + \path[fill=pgfstrokecolor] (0,0) -- (45:.2) arc(45:-45:.2) -- cycle; + \path[fill=pgfstrokecolor] (0,0) -- (135:.2) arc(135:225:.2) -- cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/radio teletype} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/radio teletype/.pic={% + \path[draw] (-.2,.25) -- (.2,.25) (-.15,.18) -- (.15,.18) + (0,.25) -- (0,-.25) + ([shift=(30:.1)]0,-.15) arc(30:330:.1);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/railroad} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/railroad/.pic={% + \ifn@to@pp@below% + \path[pic actions] (M.south west) -- (M.south east) + ([shift={(.08,-0.08)}]M.south west) circle(.08) + ([shift={(.24,-0.08)}]M.south west) circle(.08) + ([shift={(-.08,-0.08)}]M.south east) circle(.08) + ([shift={(-.24,-0.08)}]M.south east) circle(.08); + \else + \path[pic actions] (-.45,.08) -- (.45,.08) + (-.37,0) circle(0.08) + (-.21,0) circle(0.08) + (.21,0) circle(0.08) + (.37,0) circle(0.08); + \fi + }, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/reconnaissance} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/reconnaissance/.pic={% + \path[draw] (M.north east)--(M.south west);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/recovery unmanned systems} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/recovery unmanned systems/.pic={% + \path[draw] (-.5,.15) to [out=-80,in=180] (0,-.15) to + [out=0,in=260] (.5,.15);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/rifle} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/rifle/.pic={% + \pic[draw]{natoapp6c/s/weapon=full}; + \pic[draw]{natoapp6c/s/weapon=rifle};}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/rising} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/rising/.pic={ + \path[draw,fill=pgfstrokecolor] (0, 0.2) -- (0, -0.167) + (0.1, -0.2) -- (-0.1, -0.2) -- (0, 0.0);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/riverine} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/riverine/.pic={% + \ifn@to@pp@below% + \path[pic actions] (M.south west) + to [out=-90,in=-90,looseness=.5] (M.south east) -- cycle; + \else% + \path[pic actions] (-.5,.15) to [out=-80,in=180] (0,-.15) to + [out=0,in=260] (.5,.15) -- cycle; + \fi}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/rocket launcher} +% \begin{macrocode} +\tikzset{% + pics/natoapp6c/s/rocket launcher/.is choice, + pics/natoapp6c/s/rocket launcher/base/.style={ + code={ + \pic[draw]{natoapp6c/s/weapon=base}; + \pic[draw]{natoapp6c/s/weapon=rifle}; + \pic[yshift=-4,draw]{natoapp6c/s/weapon=rifle}; + }}, + pics/natoapp6c/s/rocket launcher/anti tank/.style={ + code={ + \pic[draw]{natoapp6c/s/rocket launcher=base}; + \pic[draw]{natoapp6c/s/weapon=anti tank}; + }}, + pics/natoapp6c/s/rocket launcher/single/.style={ + code={ + \pic[draw]{natoapp6c/s/rocket launcher=base}; + \pic[draw]{natoapp6c/s/weapon=bottom};}}, + pics/natoapp6c/s/rocket launcher/multiple/.style={ + code={ + \pic[draw]{natoapp6c/s/rocket launcher=single}; + \pic[yshift=-6,draw]{natoapp6c/s/weapon=multi fire};}}, + pics/natoapp6c/s/rocket launcher/single head/.style={ + code={% + \pic[yshift=4,draw]{natoapp6c/s/weapon=rifle};}}, + pics/natoapp6c/s/rocket launcher/multiple head/.style={ + code={ + \pic[yshift=-4,draw]{natoapp6c/s/weapon=rifle}; + \pic[yshift=-6,draw]{natoapp6c/s/weapon=rifle}; + }}, + pics/natoapp6c/s/rocket launcher/.default=single, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/rotary wing} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/rotary wing/.pic={ + \path[pic actions] + (0.44, 0.15) -- (0.44, -0.15) -- (-0.44, 0.15) -- (-0.44, -0.15) -- + cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/runway} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/runway/.pic={% + \path[draw] (-.3,-.15) -- (.3,-.15) (-.2,-.2) -- (.2,.2);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/sailing boat} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/sailing boat/.pic={% + \path[draw] + (-0.15, -0.2) -- + ( 0.15, -0.2) -- + ( 0.25, -0.025) -- + (-0.25, -0.025) -- cycle + ( 0, -0.025) -- (0, 0.2) + (0.025, 0) -- (0.025, 0.19) -- (0.225, 0) -- cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/satellite} +% \begin{macrocode} +\tikzset{% + pics/natoapp6c/s/satellite/.is choice, + pics/natoapp6c/s/satellite/none/.style={ + code={ + \iftikz@mode@fill + \def\n@to@pp@next{\path[draw,fill=pgfstrokecolor,pic actions]} + \else + \def\n@to@pp@next{\path[pic actions]} + \fi + \n@to@pp@next + ( 0.45, 0.075) rectangle ( 0.15, -0.075) + ( 0.075, 0.075) rectangle (-0.075, -0.075) + (-0.45, 0.075) rectangle (-0.15, -0.075) + ( 0.15, 0) -- (0.075, 0) + (-0.15, 0) -- (-0.075, 0); + }}, + pics/natoapp6c/s/satellite/astronomical/.style={ + code={ + \begingroup\tikz@picmode + \pic{natoapp6c/s/satellite=none}; + \endgroup + \path[pic actions] + (0.04, 0.075) rectangle (-0.04, 0.2) + (0.02, -0.075) rectangle (-0.02, -0.2);}}, + pics/natoapp6c/s/satellite/bio/.style={ + code={ + \begingroup\tikz@picmode + \pic[yshift=-1]{natoapp6c/s/satellite=none}; + \endgroup + \path[pic actions] + (-0.075, 0.13) circle (0.07) + ($(-0.075, 0.13) + (60:0.07)$) -- + ++(-30:0.22) -- ++(0, -0.025) -- (-0.005, 0.13) -- cycle; + }}, + pics/natoapp6c/s/satellite/communications/.style={ + code={ + \begingroup\tikz@picmode + \pic[yshift=-1]{natoapp6c/s/satellite=none}; + \endgroup + \path[pic actions] + (0, 0.075) -- (0, 0.125) + (0, 0.125) arc (270:340:0.25 and 0.1) + (0, 0.125) arc (270:200:0.25 and 0.1); + }}, + pics/natoapp6c/s/satellite/navigation/.style={ + code={ + \begingroup\tikz@picmode + \pic[yshift=-3.75,scale=.9]{natoapp6c/s/satellite=none}; + \endgroup + \pic[scale=.5,yshift=3.5]{natoapp6c/s/navigation}; + }}, + pics/natoapp6c/s/satellite/earth observing/.style={ + code={ + \begingroup\tikz@picmode + \pic[yshift=3.75, scale=0.9]{natoapp6c/s/satellite=none}; + \endgroup + \path[pic actions] + (0, 0.065) -- +(315:0.125) + (0, 0.065) -- +(225:0.125) + (0, -0.12) circle (0.08); + }}, + pics/natoapp6c/s/satellite/tether/.style={ + code={ + \begingroup\tikz@picmode + \pic[yshift=-3.75, scale=0.9]{natoapp6c/s/satellite=none}; + \endgroup + \path[pic actions] + (0, -0.066) -- +(30:0.3) + (0, -0.066) +(30:0.375) circle(0.075); + }}, + pics/natoapp6c/s/satellite/small/.style={ + code={ + \begingroup\tikz@picmode + \pic[scale=0.6]{natoapp6c/s/satellite=none}; + \endgroup + \path[pic actions] + (0.05, 0.2) -- ( 0, 0.1) -- (-0.05, 0.2) + (0.05, -0.2) -- ( 0, -0.1) -- (-0.05, -0.2) + (-0.4, 0.05) -- (-0.3, 0) -- (-0.4, -0.05) + ( 0.4, 0.05) -- ( 0.3, 0) -- ( 0.4, -0.05); + }}, + pics/natoapp6c/s/satellite/reconnaissance/.style={ + code={ + \pic[yshift=-1,fill=pgfstrokecolor]{natoapp6c/s/satellite=none}; + \path[pic actions] + (-0.075, -0.05) -- +(250:0.1) + (-0.025, -0.05) -- +(260:0.1) + ( 0.025, -0.05) -- +(280:0.1) + ( 0.075, -0.05) -- +(290:0.1); + }}, + pics/natoapp6c/s/satellite/.default=none, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/sea mine} +% \begin{macrocode} +\tikzset{% + pics/natoapp6c/s/sea mine/.is choice, + pics/natoapp6c/s/sea mine/top half/.style={ + code={\path[draw,join=bevel,pic actions] + (.2,0) arc(0:35:.2 and .175) -- + (42:.34 and .3) -- (48:.34 and .3) -- + % ($(45:.1) + (40:.2)$) -- ($(45:.1)+(50:.2)$) -- + (55:.2 and .175) arc(50:75:.2 and .175) -- + (80:.26 and .23) -- (100:.26 and .23) -- + (105:.2 and .175) arc(100:125:.2 and .175) -- + (132:.34 and .3) -- (138:.34 and .3) -- + %($(135:.1)+(130:.2)$) -- ($(135:.1)+(140:.2)$) -- + (145:.2 and .175) arc(145:180:.2 and .175); + }}, + pics/natoapp6c/s/sea mine/bottom half/.style={ + code={ + \path[pic actions] (.2,0) arc(0:-180:.2);}}, + pics/natoapp6c/s/sea mine/full/.style={ + code={ + \pic[fill=pgfstrokecolor]{natoapp6c/s/sea mine/top half}; + \pic[fill=pgfstrokecolor]{natoapp6c/s/sea mine/bottom half};}}, + pics/natoapp6c/s/sea mine/neutralised/.style={ + code={ + \begin{scope}[even odd rule] + \clip [rotate=42] (-.4,-.015) rectangle (.4,.015) [reverseclip]; + \clip [rotate=-42] (-.4,-.015) rectangle (.4,.015) [reverseclip]; + \pic {natoapp6c/s/sea mine=full}; + \end{scope} + }}, + pics/natoapp6c/s/sea mine/neutralized/.style=natoapp6c/s/sea mine/neutralised, + pics/natoapp6c/s/sea mine/.default=full, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/seabed installation} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/seabed installation/.pic={% + \path[pic actions] + (-0.25, -0.2) -- + ( 0.25, -0.2) -- + ( 0.25, -0.075) -- + ( 0.05, -0.075) -- + ( 0.05, 0.025) -- + (-0.125, 0.025) -- + (-0.125, 0.2) -- + (-0.25, 0.2) -- cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/search} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/search/.pic={% + \path[draw] (-.3,-.2)--(0,-.4)--(.3,-.2) (0,.4)--(0,-.4);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/searching} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/searching/.pic={% + \path[pic actions] + (-0.4, 0) + arc (180:0:0.1) + arc (180:360:0.1) + arc (180:0:0.1) + arc (180:270:0.1) -- +(0.1, 0) + (0.3, -0.05) -- (0.4, -0.1) -- (0.3, -0.15);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/semi trailer truck} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/semi trailer truck/.pic={ + \pic[scale=.75,xshift=-2,draw]{natoapp6c/s/utility vehicle}; + \path[pic actions] (0.21, -0.025) -- (0.35, -0.025) + (0.35, 0.05) -- (0.35, -0.1);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/sensor} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/sensor/.pic={% + \path[fill=pgfstrokecolor] (-.3,0) arc (270:360:.3) arc (180:270:.3) arc + (90:180:.3) arc (0:90:.3);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/ship} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/ship/.pic={% + \path[pic actions] + (-0.2, -0.2) -- + ( 0.2, -0.2) -- + ( 0.35, 0.05) -- + ( 0.15, 0.05) -- + ( 0.15, 0.2) -- + (-0.15, 0.2) -- + (-0.15, 0.05) -- + (-0.35, 0.05) -- + cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/signal} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/signal/.pic={% + \path[draw] (M.north west) -- (0,-.1) -- (0,.1) -- (M.south east);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/signals intelligence} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/signals intelligence/.pic={% + \path[draw] (-.2,.2) -- (-.13,.25) -- (-.07,.2) -- (0,.25) -- + (.07,.2) -- (.13,.25) -- (.2,.2) (0,.25) -- (0,-.2);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/ski} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/ski/.pic={ + \path[draw] (-.15,-.15) -- (.1,.2) (.15,-.15) -- (-.1,.2) + (-.1,-.2) -- (-.2,-.1) + (.1,-.2) -- (.2,-.1); + }, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/sled} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/sled/.pic={ + \ifn@to@pp@below% + \draw ([shift={(-.15,.15)}]M.south west) to[in=180, out=-90] + ++(.15,-.15) -- (M.south east) to[in=-90, out=0] + ([shift={(.15,.15)}]M.south east); + \else% + \draw ([shift={(.3,.1)}]M.west) to[in=180, out=-90] + ([shift={(.5,-.1)}]M.west) -- + ([shift={(-.5,-.1)}]M.east) to[in=-90, out=0] + ([shift={(-.3,.1)}]M.east); + \fi + }, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/small squashed text} +% \begin{macrocode} +\tikzset{% + pics/natoapp6c/s/small squashed text/.style={ + code={\n@to@pp@text@smallsquashed{#1};}}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/small text} +% \begin{macrocode} +\tikzset{% + pics/natoapp6c/s/small text/.style={code={\n@to@pp@text@small{#1};}}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/sniper} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/sniper/.pic={% + \path[draw] (-.2,.2)--(-.05,.2) (.05,.2)--(.2,.2) (0,.15)--(0,-.2);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/space station} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/space station/.pic={ + \path[join=bevel,pic actions] + (-80:.15 and .06) -- (0.025, 0.175) arc(0:180:0.025) -- (-100:.15 and .06) + ($(80:.25 and 0.1)+(0,-.0125)$) arc(80:-260:.25 and .1) -- + (-260:.15 and .06) arc (-260:80:.15 and .06) -- cycle + (-82:.25 and .1) -- (0.025, -0.175) arc(360:180:0.025) -- (-98:.25 and .1); + }, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/squashed text} +% \begin{macrocode} +\tikzset{% + pics/natoapp6c/s/squashed text/.style={code={\n@to@pp@text@squashed{#1};}}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/submarine} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/submarine/.pic={ + \path[fill=pgfstrokecolor,pic actions] + (0.4, 0) -- + (0.25, 0.15) -- + (-0.25, 0.15) -- + (-0.4, 0) -- + (-0.25, -0.15) -- + (0.25, -0.15) -- cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/submersible} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/submersible/.pic={ + \path[pic actions] + ($(0, -0.05) + (106.6:0.35 and 0.15)$) + arc (106.6:433.4:0.35 and 0.15) |- (0, 0.2) -| cycle; + }, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/supply} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/supply/.pic={ + \path[pic actions] + ($(M.east)-(0,.25)$)--($(M.west)-(0,.25)$);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/surface combatant} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/surface combatant/.pic={ + \pic {natoapp6c/s/warfare vessel}; + \path[draw,fill=pgfstrokecolor] + (0.12, 0.05) -- + (0.12, 0.14) -- + (0.06, 0.14) -- + (0.06, 0.2) -- + (0.24, 0.2) -- + (0.24, 0.272) -- + (0.06, 0.272) -- + (0.06, 0.35) -- + (-0.06, 0.35) -- + (-0.06, 0.272) -- + (-0.24, 0.272) -- + (-0.24, 0.2) -- + (-0.06, 0.2) -- + (-0.06, 0.14) -- + (-0.12, 0.14) -- + (-0.12, 0.05) -- cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/survey} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/survey/.pic={ + \path[draw,fill=pgfstrokecolor,pic actions] + (0, -0.1) -- (0, 0.195) -- (0.25, 0.0475) -- cycle; + \path[pic actions] (0.1, -0.2) -- (0, -0.1) -- (-0.1, -0.2);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/tactical satellite} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/tactical satellite/.pic={ + \path[fill=pgfstrokecolor,draw] + (-.3,-.2) rectangle(-.15,.2) + (.15,-.2) rectangle( .3,.2) + (-.075,-.15) rectangle (.075,.15) + (-.15,0) -- (.15,0) + (0,-.15) -- (0,-.3); + \path[draw] (-.2,-.35) to [out=40,in=140,looseness=1] (.2,-.35);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/tank} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/tank/.pic={% + \pic[draw]{natoapp6c/s/vehicle}; + \path[pic actions] ( 0.35, 0.2) -- (-0.35, 0.2);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/text} +% \begin{macrocode} +\tikzset{% + pics/natoapp6c/s/text/.style={code={% + \n@to@pp@dbg{3}{Text: `#1'}% + \n@to@pp@text@normal{#1};}}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/topographic} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/topographic/.pic={ + \path[draw] (0,.05) -- (0,.2) + (0,.05) -- (-.1,-.2) + (0,.05) -- (.1,-.2) + (-30:.15) arc[radius=.15,start angle=-30,end angle=-150];}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/torpedo} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/torpedo/.pic={ + \path[draw,fill=pgfstrokecolor,pic actions] + (-0.35, 0) -- + (-0.3, 0.075) -- + ( 0.25, 0.075) -- + ( 0.35, -0.075) -- + ( 0.35, 0.075) -- + ( 0.25, -0.075) -- + (-0.3, -0.075) -- cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/towed} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/towed/.pic={ + \ifn@to@pp@below% + \path[pic actions] (M.south east) -- (M.south west) + ([shift={(.08,0)}]M.south east) circle(.08) + ([shift={(-.08,0)}]M.south west) circle(.08); + \else% + \path[draw] (-.32,0) -- (.32,0) (-.4,0) circle(.08) (.4,0) circle(.08);% + \fi}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/tracked} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/tracked/.pic={ + \ifn@to@pp@below% + \path[pic actions] + ([shift={(.08,-.16)}]M.south west) + arc [radius=.08,start angle=-90,end angle=-270] + -- ([shift={(-.08,0)}]M.south east) + arc [radius=.08,start angle=90,end angle=-90] + -- cycle; + \else% + \path[pic actions] + (-.3,-.1) arc [radius=.1,start angle=-90,end angle=-270] + -- (.3,.1) arc [radius=.1,start angle=90,end angle=-90] + -- cycle; + \fi}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/train locomotive} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/train locomotive/.pic={ + \path[pic actions] + (.35,-.3)--(-.35,-.3)--(-.35,.3)--(0,.3)--(0,0)--(0.35, 0)--cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/transportation} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/transportation/.pic={ + \path[pic actions] (0,0) circle(.2) + (180:.2) -- (0:.2) + (225:.2) -- (45:.2) + (270:.2) -- (90:.2) + (315:.2) -- (135:.2) ;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/unexploded ordnance} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/unexploded ordnance/.pic={ + \begin{scope}[transparency group=knockout] + \path[draw,fill=pgfstrokecolor,pic actions] (0,0) circle(.2); + \pic[opacity=0]{natoapp6c/s/small squashed text=UXO}; + \end{scope}}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/unmanned} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/unmanned/.pic={ + \path[pic actions] + (0,-0.1) + --(0.45,0.05) + --(0.45,0.1) + --(0,0.025) + --(-0.45,0.1) + --(-0.45,0.05) + --cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/utility vehicle} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/utility vehicle/.pic={% + \pic[draw]{natoapp6c/s/vehicle}; + \path[pic actions] + (0.35, 0.3) to[in=-90, out=-90, looseness=1] (-0.35, 0.3); }, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/vehicle} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/vehicle/.pic={ + \path[pic actions] + (-0.35, 0.2) -- (-0.35, -0.2) -- ( 0.35, -0.2) -- ( 0.35, 0.2) + (-0.35, -0.2) -- (-0.35, -0.3) + (0.35, -0.2) -- ( 0.35, -0.3) + (-0.35, 0.2) -- (-0.35, 0.3) + (0.35, 0.2) -- ( 0.35, 0.3);} +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/video imagery} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/video imagery/.pic={ + \path[pic actions] + (-0.4, 0.2) -- (-0.4, -0.2) -- (0.05, -0.2) -- (0.2, 0.2) -- cycle + (0.075, -0.15) -- (0.4, -0.15) + (0.16, 0.1) -- (0.4, 0.1); + \path[draw,fill=pgfstrokecolor,pic actions](0.38,-.2) rectangle (0.42,.15);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/warfare vessel} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/warfare vessel/.pic={ + \path[draw,fill=pgfstrokecolor] (0, -0.2) -- (0.3, 0.05) -- (-0.3, 0.05) -- cycle;}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/water} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/water/.pic={ + \path[pic actions] + (-0.3, 0.05) -- (0, 0.05) to[in=90, out=0] (0.3, -0.2) + (0, 0.05) -- (0, 0.2) + (0.075, 0.2) -- (-0.075, 0.2);}, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/wheeled} +% \begin{macrocode} +\tikzset{% + pics/natoapp6c/s/wheeled/.is choice, + pics/natoapp6c/s/wheeled/and tracked/.style={ + code={ + \ifn@to@pp@below% + \path[pic actions] + ([shift={(.4,-.16)}]M.south west) + arc [radius=.08,start angle=-90,end angle=-270] + -- ([shift={(-.08,0)}]M.south east) + arc [radius=.08,start angle=90,end angle=-90] + -- cycle + ([shift={(.08,-.08)}]M.south west) circle(.08); + \else% + \path[pic actions] + (-.1,-.08) arc [radius=.08,start angle=-90,end angle=-270] + -- (.32,.08) arc [radius=.08,start angle=90,end angle=-90] + -- cycle + (-.4,0) circle(0.08); + \fi}}, + pics/natoapp6c/s/wheeled/limited/.style={ + code={ + \ifn@to@pp@below% + \path[pic actions] (M.south west) -- (M.south east) + ([shift={(.08,-.08)}]M.south west) circle(.08) + ([shift={(-.08,-.08)}]M.south east) circle(.08); + \else + \path[pic actions] (-.4,.08) -- (.4,.08) + (-.32,0) circle(0.08) (.32,0) circle(0.08); + \fi}}, + pics/natoapp6c/s/wheeled/cross country/.style={ + code={\pic{natoapp6c/s/wheeled=limited}; + \ifn@to@pp@below% + \path[pic actions] ([shift={(0,-.08)}]M.south) circle(.08); + \else + \path[pic actions] (0,0) circle(0.08); + \fi}}, + pics/natoapp6c/s/wheeled/semi/.style={ + code={\pic{natoapp6c/s/wheeled=limited}; + \ifn@to@pp@below% + \path[pic actions] ([shift={(.24,-.08)}]M.south west) circle(.08); + \else + \path[pic actions] (-.16,0) circle(0.08); + \fi}}, + pics/natoapp6c/s/wheeled/.default=limited, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \subsubsection{Some extra MIL-STD symbols} +% +% Extra NATO App6(c) symbol (from MIL-STD) +% +% \iffalse +% .................................................................... +% \fi +% \begin{NatoAppSymbol}{natoapp6c/s/prison} +% \begin{macrocode} +\tikzset{% + natoapp6c/s/prison/.pic={ + \path[pic actions] (-.3,-.3)rectangle(.3,.3) + (-.23,-.30)--(-.23, .3) + ( .23,-.30)--( .23, .3) + (-.08,-.30)--(-.08,-.2) + (-.08,-.15) circle (.05) + (-.08,-.1) --(-.08, .3) + ( .08,-.30)--( .08,-.2) + ( .08,-.15) circle (.05) + ( .08,-.1) --( .08, .3) + (0,.15) circle(.07 and .1); + }, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% \iffalse +% </natoapp6c> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/natoapp6c/text.dtx b/macros/latex/contrib/wargame/source/natoapp6c/text.dtx new file mode 100644 index 0000000000..5a441dc482 --- /dev/null +++ b/macros/latex/contrib/wargame/source/natoapp6c/text.dtx @@ -0,0 +1,57 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*natoapp6c> +% \fi +%\subsubsection{Text on symbols} +% +% \begin{TikzKey}{/tikz/natoapp6c/normal text, +% /tikz/natoapp6c/squashed text, +% /tikz/natoapp6c/small text, +% /tikz/natoapp6c/small squashed text} +% +% NATO App6 does not specify any particular font for text symbols +% (main, modifiers, or amplifiers) but here we choose to use \TeX{} +% Gyro Heros (a Gothic font, i.e., Helvetica-like). +% +% \begin{macrocode} +\newcommand\n@to@ppfont[2][b]{% + \fontencoding{T1}\fontfamily{qhv}\fontseries{#1}\fontsize{#2}{0}\selectfont} +\tikzset{% + natoapp6c/text/.style={% + shape=rectangle,% + draw=none,% + fill=none,% + transform shape,% + anchor=center}, + natoapp6c/normal text/.style={font=\n@to@ppfont{12}}, + natoapp6c/squashed text/.style={font=\n@to@ppfont[bc]{12}}, + natoapp6c/small text/.style={font=\n@to@ppfont{10}}, + natoapp6c/squashed small text/.style={font=\n@to@ppfont[bc]{10}}, +} +% \end{macrocode} +% \end{TikzKey} +% +% \begin{Macro}{\n@to@pp@text@normal, +% \n@to@pp@text@squashed, +% \n@to@pp@text@small, +% \n@to@pp@text@smallsquashed} +% +% These macros are short-hands for making a node at $(0,0)$ in the +% local scope. +% +% \begin{macrocode} +\newcommand\n@to@pp@text@normal[2][] {% + \node[natoapp6c/text,natoapp6c/normal text,#1]{#2}} +\newcommand\n@to@pp@text@squashed[2][]{% + \node[natoapp6c/text,natoapp6c/squashed text,#1]{#2}} +\newcommand\n@to@pp@text@small[2][] {% + \node[natoapp6c/text,natoapp6c/small text,#1]{#2}} +\newcommand\n@to@pp@text@smallsquashed[2][]{% + \node[natoapp6c/text,natoapp6c/squashed small text,#1]{#2}} +% \end{macrocode} +% \end{Macro} +% +% \iffalse +% </natoapp6c> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/natoapp6c/util.dtx b/macros/latex/contrib/wargame/source/natoapp6c/util.dtx new file mode 100644 index 0000000000..18c7689878 --- /dev/null +++ b/macros/latex/contrib/wargame/source/natoapp6c/util.dtx @@ -0,0 +1,60 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*natoapp6c> +% \fi +% \subsubsection{Utility macros used in the symbols} +% +% Here, we define the main symbols used when making markers. Since +% some of these symbols share code, we will create some regular \TeX{} +% macros to hold the path definitions. This is by far the simplest +% way of storing just the path specifications. +% +% \begin{Macro}{\testpath} +% \begin{macrocode} +\def\testpath#1{\csname n@toapp@#1\endcsname} +% \end{macrocode} +% \end{Macro} +% +% Corps support for \spec{friendly}, \spec{hostile}, +% \spec{neutral}, and \spec{unknown} factions. +% +% \begin{Macro}{\n@toapp@corps@sup@friendly, +% \n@toapp@corps@sup@hostile, +% \n@toapp@corps@sup@neutral, +% \n@toapp@corps@sup@unknown} +% \begin{macrocode} +\def\n@toapp@corps@sup@friendly{(.75,.5)--(.5,0)--(.75,-.5)} +% (M.north east)--(M.east-.25,0)--(M.south east)} +\def\n@toapp@corps@sup@hostile{(.95,.5)--(.45,0)--(.95,-.5)} +\def\n@toapp@corps@sup@neutral{(.5,.5)--(.35,0)--(.5,-.5)} +\def\n@toapp@corps@sup@unknown{(.75,.5)--(.5,0)--(.75,-.5)} +% \end{macrocode} +% \end{Macro} +% +% Corps support, base +% +% \begin{Macro}{\n@toapp@corps@support} +% \begin{macrocode} +\def\n@toapp@corps@support#1{ + \ifx\n@to@pp@friendly#1\n@toapp@corps@sup@friendly% + \else\ifx\n@to@pp@hostile#1\n@toapp@corps@sup@hostile% + \else\ifx\n@to@pp@neutral#1\n@toapp@corps@sup@neutral% + \else\ifx\n@to@pp@unknown#1\n@toapp@corps@sup@unknown% + \fi\fi\fi\fi} +% \end{macrocode} +% \end{Macro} +% +% \begin{NatoAppSymbol}{natoapp6c/s/TBD} +% Special placeholder for symbols To Be Done. +% +% \begin{macrocode} +\tikzset{ + natoapp6c/s/TBD/.pic={\n@to@pp@text@normal{\color{magenta}TBD};} +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% \iffalse +% </natoapp6c> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/natoapp6c/weaponry.dtx b/macros/latex/contrib/wargame/source/natoapp6c/weaponry.dtx new file mode 100644 index 0000000000..3138da9e75 --- /dev/null +++ b/macros/latex/contrib/wargame/source/natoapp6c/weaponry.dtx @@ -0,0 +1,88 @@ +% \iffalse +% -------------------------------------------------------------------- +%<*natoapp6c> +% \fi +% \subsubsection{Symbols used when defining weaponry} +% +% +% \begin{NatoAppSymbol}{natoapp6c/s/weapon} +% \begin{macrocode} +\tikzset{ + pics/natoapp6c/s/weapon/.is choice, + pics/natoapp6c/s/weapon/base/.style={ + code={\path [pic actions] (0,-0.2)--(0,.2);}}, + pics/natoapp6c/s/weapon/top/.style={ + code={\path [pic actions] (0,.2)--(0,.35);}}, + pics/natoapp6c/s/weapon/bottom/.style={ + code={\path [pic actions] (0,.-.35)--(0,-.2);}}, + pics/natoapp6c/s/weapon/rifle/.style={ + code={\path [pic actions] (0.2, 0.1)--(0, 0.35)--(-0.2,0.1);}}, + pics/natoapp6c/s/weapon/machine gun/.style={ + code={\path [pic actions] (0.2, -0.35)--(-0.2, -0.35);}}, + pics/natoapp6c/s/weapon/grenade launcher/.style={ + code={\path [pic actions] (0,0) circle (0.1);}}, + pics/natoapp6c/s/weapon/missile launcher/.style={ + code={% + \path [pic actions] (0.2, 0.15) + to[out=90,in=90,looseness=1.75] (-0.2, 0.15);}}, + pics/natoapp6c/s/weapon/non lethal/.style={ + code={\path [pic actions] (-.2,.35) -- (.2,.35);}}, + pics/natoapp6c/s/weapon/multi fire/.style={ + code={\path[pic actions] (.2,-.2)--(.2, .2) (-.2,-.2)--(-.2,0.2);}}, + pics/natoapp6c/s/weapon/air defence/.style={ + code={% + \path[pic actions] (0.2, -0.4) + to[out=90,in=90,looseness=1.7] (-0.2, -0.4) -- cycle;}}, + pics/natoapp6c/s/weapon/anti tank/.style={ + code={\path[pic actions] (0.2, -0.4)--(0,-0.2)--(-0.2,-0.4);}}, + pics/natoapp6c/s/weapon/full/.style={ + code={% + \pic[draw]{natoapp6c/s/weapon=base}; + \pic[draw]{natoapp6c/s/weapon=top}; + \pic[draw]{natoapp6c/s/weapon=bottom};}}, + pics/natoapp6c/s/weapon/.default=full +} +% \end{macrocode} +% \end{NatoAppSymbol} +% +% +% \begin{NatoAppSymbol}{natoapp6c/s/type} +% +% (Weight) class of weapons: light, medium, heavy +% +% \begin{macrocode} +\tikzset{ + pics/natoapp6c/s/type/.is choice, + pics/natoapp6c/s/type/light/.style={ + code={\path [fill=pgfstrokecolor,pic actions] (-0.2, -0.12) rectangle (.2,-.08);}}, + pics/natoapp6c/s/type/medium/.style={ + code={ + \path [fill=pgfstrokecolor,pic actions] + (-0.2, -0.12) rectangle (.2,-.08) + (-0.2, -0.22) rectangle (.2,-.18);}}, + pics/natoapp6c/s/type/heavy/.style={ + code={ + \path [fill=pgfstrokecolor,pic actions] + (-0.2, -0.12) rectangle (.2,-.08) + (-0.2, -0.22) rectangle (.2,-.18) + (-0.2, -0.32) rectangle (.2,-.28);}}, + pics/natoapp6c/s/type/vlight/.style={ + code={\path [fill=pgfstrokecolor,pic actions] + (-.025,-0.2) rectangle (.025,.2);}}, + pics/natoapp6c/s/type/vmedium/.style={ + code={\path [fill=pgfstrokecolor,pic actions] + (-.075,-0.2) rectangle (-.025,.2) + ( .025, -0.2) rectangle (.075,.2);}}, + pics/natoapp6c/s/type/vheavy/.style={ + code={\path [fill=pgfstrokecolor,pic actions] + (-.125,-0.2) rectangle (-.075,.2) + (-.025,-0.2) rectangle ( .025,.2) + ( .075,-0.2) rectangle ( .125,.2);}}, + pics/natoapp6c/s/type/.default=light, +} +% \end{macrocode} +% \end{NatoAppSymbol} +% \iffalse +% </natoapp6c> +% -------------------------------------------------------------------- +% \fi diff --git a/macros/latex/contrib/wargame/source/package.dtx b/macros/latex/contrib/wargame/source/package.dtx new file mode 100644 index 0000000000..908be36b32 --- /dev/null +++ b/macros/latex/contrib/wargame/source/package.dtx @@ -0,0 +1,48 @@ +% \subsection{The \texttt{wargame} package} +% \label{sec:impl:sty} +% +% \iffalse +%<*package> +% \fi +% +% First, package identification +% +% \begin{macrocode} +\ProvidesPackage{wargame} +% \end{macrocode} +% +% Then needed packages +% +% \begin{macrocode} +\RequirePackage[svgnames]{xcolor} +\RequirePackage{tikz} +% \end{macrocode} +% +% A switch to include terrain pictures (which take a lot of memory for +% some reason). +% +% \begin{macrocode} +\@ifundefined{ifhex@terrain@pic}{% + \newif\ifhex@terrain@pic + \hex@terrain@picfalse}{} +% \end{macrocode} +% +% Options +% +% \begin{macrocode} +\DeclareOption{noterrainpic}{% + \hex@terrain@picfalse} +\DeclareOption{terrainpic}{% + \hex@terrain@pictrue} +\ProcessOptions\relax +% \end{macrocode} +% +% Finally, the used \TikZ{} libraries +% +% \begin{macrocode} +\usetikzlibrary{wargame.hex,wargame.natoapp6c,wargame.chit} +% \end{macrocode} +% +% \iffalse +%</package> +% \fi diff --git a/macros/latex/contrib/wargame/source/tests/chits.dtx b/macros/latex/contrib/wargame/source/tests/chits.dtx new file mode 100644 index 0000000000..7dcf26c50d --- /dev/null +++ b/macros/latex/contrib/wargame/source/tests/chits.dtx @@ -0,0 +1,74 @@ +% \section{Some test chits} +% +% \iffalse +%<*testchits> +% \fi +% Some chits for testing stuff +% +% \begin{macrocode} +\def\firstchit{ + % \chitdbglvl=5 + % \natoappdbglvl=5 + \chit[symbol={ + echelon=army, + main=infantry, + lower=mountain, + faction=friendly, + left={text=A}, + frame={fill=yellow!50!black}, + ultra thick, + command=land}, + left={chit/identifier={1}}, + right={chit/identifier={2}}, + factors={chit/2 factors={4,8}}, + frame={draw=black}, + color=white,text=yellow,fill={blue}]} +\makeatletter +\def\secondchit{% + \@ifnextchar({\second@chit}{\second@chit(0,0)}%) +} +\def\second@chit(#1){ + \node[draw, chit={symbol={[main=fixed wing, + faction=friendly, + lower={text=F}, + command=air](0,-.15)}, + left={[{red,font=\noexpand\sffamily}]chit/identifier={Fighter}}, + right={chit/identifier={USAF}}, + factors={chit/1 factor=3}}] at (#1){};} +\def\thirdchit{ + \chit[symbol={[echelon=battalion, + main={[fill]artillery}, + faction=friendly, + command=land, + below=wheeled]}, + left={chit/identifier={XVII}}, + right={chit/identifier={IJA}}, + factors={chit/2 factors artillery={2,6,5}}]} +\def\fourthchit{ + \chit[symbol={[main=fixed wing, + faction=friendly, + lower={text=F}, + command=air](0,-.15)}, + left={[{red,font=\noexpand\sffamily}]chit/identifier={Fighter}}, + right={chit/identifier={USAF}}, + factors={chit/1 factor=3}]} +\tikzset{ + wg/big text/.pic={ + \node[shape=rectangle, + font=\sffamily\fontsize{18}{0}\selectfont]{#1};}} +\def\turnchit{ + \chit[full={wg/big text={Turn}},black,fill=yellow!20!white]} +\tikzset{ + my chit/.style={/chit/symbol={[ + faction=friendly, + command=land, + bottom=amphibious, + main={armoured}]}, + /chit/left={chit/identifier={Mine}}, + /chit/factors={chit/2 factors={2,4}}}} +\tikzset{ + fort/.style={/chit/full={[scale=.625]hex/fortress 2}}} +% \end{macrocode} +% \iffalse +%</testchits> +% \fi diff --git a/macros/latex/contrib/wargame/source/tests/map.dtx b/macros/latex/contrib/wargame/source/tests/map.dtx new file mode 100644 index 0000000000..e685aa6179 --- /dev/null +++ b/macros/latex/contrib/wargame/source/tests/map.dtx @@ -0,0 +1,57 @@ +% \section{A test map} +% +% \iffalse +%<*testmap> +% \fi +% \begin{Macro}{\testmap} +% +% A map for testing stuff +% +% \begin{macrocode} +\def\testmap{ + \hex[] (r=0,c=0) + \hex[] (r=0,c=1) + \hex[] (r=0,c=2) + \hex[] (r=0,c=3) + \hex[] (r=1,c=0) + \hex[town={pic=hex/town/city,name=London,font=\noexpand\bfseries}] (r=1,c=1) + \hex[terrain={woods}] (r=1,c=2) + \hex[] (r=1,c=3) + \hex[] (r=2,c=0) + \hex[] (r=2,c=1) + \hex[town={name=Oxford,red}] (r=2,c=2) + \hex[] (r=2,c=3) + \hex[] (r=3,c=0) + \hex[town={name=Cambridge}] (r=3,c=1) + \hex[] (r=3,c=2) + \hex[] (r=3,c=3) + \river + (hex cs:r=0,c=0,v=north west)-- + (hex cs:r=0,c=0,v=north east)-- + (hex cs:r=1,c=1,v=north west)-- + (hex cs:r=2,c=1,v=west)-- + (hex cs:r=2,c=1,v=north west)-- + (hex cs:r=2,c=1,v=north east)-- + (hex cs:r=3,c=1,v=east)-- + (hex cs:r=2,c=2,v=north east)-- + (hex cs:r=3,c=3,v=north west); + \river + (hex cs:r=2,c=0,v=east)-- + (hex cs:r=2,c=0,v=north east); + \border[dashed,line width=3pt,red] + (hex cs:r=0,c=3,v=west)-- + (hex cs:r=0,c=3,v=north west)-- + (hex cs:r=1,c=3,v=west)-- + (hex cs:r=1,c=3,v=north west)-- + (hex cs:r=1,c=3,v=north east); + \road (hex cs:r=0,c=0,e=S)--(hex cs:r=0,c=0)--(hex cs:r=1,c=1); + \road (hex cs:r=1,c=1)--(hex cs:r=0,c=2)--(hex cs:r=1,c=3); + \road (hex cs:r=1,c=1)--(hex cs:r=2,c=1)--(hex cs:r=2,c=2); + \road (hex cs:r=1,c=3)--(hex cs:r=1,c=4); + \railroad (hex cs:r=2,c=2)--(hex cs:r=3,c=2)--(hex cs:r=4,c=3); +} +% \end{macrocode} +% \end{Macro} +% \iffalse +%</testmap> +% \fi diff --git a/macros/latex/contrib/wargame/source/tests/test.tex b/macros/latex/contrib/wargame/source/tests/test.tex new file mode 100644 index 0000000000..5833d679f2 --- /dev/null +++ b/macros/latex/contrib/wargame/source/tests/test.tex @@ -0,0 +1,172 @@ +\documentclass{article} + +\usepackage{wargame} +\usetikzlibrary{decorations.markings} +\title{A test of \textsf{wargame}} +\author{} +\date{} +\input{testmap} +\input{testchits} +\begin{document} +\maketitle +%\chitdbglvl=6 +%\wargamedbglvl=5 +\natoappdbglvl=1 + +\section{A board} + +\begin{tikzpicture} + \begin{scope}[every hex/.style={/hex/label=auto}, + hex/board frame/.style={fill=Tan}] + \boardframe[0.5](c=0,r=0)(c=3,r=3) + \boardpath(c=0,r=0)(c=3,r=3) + \draw[fill=white,very thick] \hexboardpath; + \boardclip(c=0,r=0)(c=3,r=3){fill=white} + \testmap{} + \end{scope} +\end{tikzpicture} + +\section{Some chits} + +\begin{tikzpicture} + \fill[red!50] (1,-1) rectangle (3,1); + \firstchit(0,0)% + %\secondchit(2,0)% + \fourthchit(2,0)% + \thirdchit(4,0)% + \turnchit(6,0)% +% \chitdbglvl=4 + \chit[my chit](0,-2) + \chit[my chit,color=white,fill=red,right={chit/identifier=1}](2,-2) +% \chitdbglvl=0 + \chit[fort](4,-2) + \node[chit={my chit},/chit/left={[font=\noexpand\rmfamily]chit/identifier={foo}},draw] at (6,-2) {}; +% +\end{tikzpicture} + +\section{Chits on a board} +\begin{tikzpicture} + \begin{scope}[every hex/.style={/hex/label=auto},transform shape] + \boardframe[0.5](c=0,r=0)(c=3,r=3) + \boardclip(c=0,r=0)(c=3,r=3){fill=white} + \testmap{} + \firstchit(hex cs:c=2,r=1) + \secondchit(hex cs:c=3,r=0) + \thirdchit(hex cs:c=0,r=3) + + \stackchits(hex cs:c=0,r=1)(.3,.3){ + \noexpand\firstchit, + \noexpand\secondchit/\noexpand\chit[{full=chit/eliminate}]} + + \begin{scope}[m/.style={hex/long move=green}] + \path[m] (hex cs:c=3,r=0) -- (hex cs:c=3,r=1)--(hex cs:c=3,r=2); + \end{scope} + \begin{scope}[a/.style={hex/attack}] + \path[a] (hex cs:c=1,r=0) -- (hex cs:c=1,r=1); + \end{scope} + \end{scope} + \turnchit(7,3) +\end{tikzpicture} + +\section{NATO App6(C) symbols} + +\begin{tikzpicture} + \natoapp[faction=friendly,frame={faction},command=land,main=infantry](0,0) + % + \natoapp[faction=friendly, + frame={faction}, + main={infantry,engineer}, + lower=mountain, + color=red](2,0) + % + \natoapp[faction=unknown, + command=sea surface, + main={diving=military},color=blue](4,0) + % + \natoapp[faction=unknown, + command=space, + main={[fill]satellite}, + color=green](6,0) + % + \natoapp[ + faction=none, + command=base, + echelon=army, + main={text=M}, + top={text=T}, + bottom={text=B}, + left={text=L}, + right={text=R}, + below={text=V}](8,0) + % + \natoapp[faction=hostile, + frame={faction}, + command=land, + echelon=company, + main=rifle](10,0) + \begin{scope}[scale=.5] + \natoapp[faction=hostile, + command=land, + echelon=platoon, + main={rifle}](24,0) + \end{scope} + + \natoapp[faction=friendly,frame={faction}, + command=land,main=infantry,decoy](0,-2) + + \natoapp[faction=friendly,frame={faction}, + command=land,main=infantry,decoy,scale line widths,line + width=1pt](2,-2) + + \begin{scope}[scale=.5] + \natoapp[faction=friendly,frame={faction}, + command=land,main=infantry,decoy,scale line widths,line + width=1pt](8,-4) + \end{scope} +\end{tikzpicture} + +\section{Rotations} + +%\chitdbglvl=5 +%\natoappdbglvl=11 +\begin{tikzpicture} + \begin{scope}[rotate=45,transform shape] + \message{^^J======= Chit rotated 45} + \chit[symbol={[faction=friendly,command=land,echelon=division, + main=anti tank anti armour]}](0,0) + + \message{^^J======= NATO App6(D) rotated 45} + \natoapp[faction=friendly,command=land,echelon=division, + main=anti tank anti armour](0,2) + + \message{^^J======= NATO App6(D) rotated 45} + \natoapp[faction=friendly,command=land,echelon=division, + main=air defence](0,4) + \end{scope} + + \begin{scope}[shift={(4,0)}] + \message{^^J==== Normal chit} + \chit[symbol={[faction=friendly,command=land,echelon=division, + main=anti tank anti armour]}](0,0) + + \message{^^J==== Normal NATO App6(D)} + \natoapp[faction=friendly,command=land,echelon=division, + main=anti tank anti armour](0,2) + + \message{^^J==== Normal NATO App6(D)} + \natoapp[faction=friendly,command=land,echelon=division, + main=air defence](0,4) + + \end{scope} +\end{tikzpicture} + +\begin{tikzpicture} + \begin{scope}[] + \node[draw,chit={symbol={faction=friendly,command=land,main=infantry}}] + (A) {}; + \foreach \a in {north,west,south,east}{% + \draw[fill=red] (A.\a) circle(.1);} + \draw[thick,green] circle(.2); + \end{scope} +\end{tikzpicture} +\end{document} diff --git a/macros/latex/contrib/wargame/source/util/core.dtx b/macros/latex/contrib/wargame/source/util/core.dtx new file mode 100644 index 0000000000..a3c656a2b3 --- /dev/null +++ b/macros/latex/contrib/wargame/source/util/core.dtx @@ -0,0 +1,1299 @@ +% \iffalse +% ==================================================================== +% \fi +% +% \subsection{The \texttt{wargame.util} \TikZ{} library} +% \label{sec:impl:util} +% +% This library contains some utilities for use in the other +% libraries. +% +% \iffalse +%<*utils> +%\fi +% +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% +% \subsubsection{Miscellaneous macros} +% +% \begin{Macro}{\wg@dbg} +% Debugging support. The counter \cs{wargamedbglvl} sets the debug +% level. The package code then uses \cs{wg@dbg} to print out +% debugging messages. This macro takes two arguments --- the first +% is the \emph{least} debug level at which the message is printed, and +% the second is the message it self. +% +% \begin{macrocode} +\newcount\wargamedbglvl\wargamedbglvl=0 +\def\wg@dbg#1#2{% + \ifnum#1>\wargamedbglvl\relax\else\message{^^J#2}\fi} +% \end{macrocode} +% \end{Macro} +% +% \begin{Macro}{\wg@addto@macro} +% +% The macro \cs{wg@addto@macro}\marg{macro}\marg{other} adds the +% definition of the macro \meta{other} to the macro \meta{macro}. +% This uses the \cs{toks} trick of storing the \emph{tokens} of the +% definition of a \meta{macro} and \meta{other} into \spec{@} and +% expanding that token into the definition of \meta{macro}. +% Effectively, this means that the top-level definition of +% \meta{macro} and \meta{other} are expanded (i.e., macros used in +% the definition of either macro is \emph{not} expanded) and then +% that becomes the new definition of \meta{macro}. +% +% We will use this macro to do \emph{shallow} definitions of macros +% to contain keys and such. +% +% \begin{macrocode} +\long\def\wg@addto@macro#1#2{% + \begingroup + \toks@\expandafter\expandafter\expandafter{\expandafter#1#2}% + \xdef#1{\the\toks@}% + \endgroup} +% \end{macrocode} +% \end{Macro} +% +% +% \begin{Macro}{\wg@sub@nchor} +% Get anchor from sub node. We cannot use \cs{pgfpointanchor} since +% that returns the anchor coordinates in the global coordinate +% system. +% +% \begin{macrocode} +\def\wg@sub@nchor#1#2{% + \wg@dbg{3}{^^JGet `#2' in `#1'}% + \@ifundefined{pgf@sh@ns@#1}{% + \pgf@x=0cm\pgf@y=0cm}{% + \pgf@process{% + \csname pgf@sh@ma@#1\endcsname% MW + \csname pgf@sh@np@#1\endcsname% + \pgf@sh@reanchor{\csname pgf@sh@ns@#1\endcsname}{#2}}}% + \wg@dbg{10}{-> \the\pgf@x,\the\pgf@y}% +} +% \end{macrocode} +% \end{Macro} +% +% +% Scratch dimensions +% +% \begin{macrocode} +\newdimen\wg@tmpa +\newdimen\wg@tmpb +\newdimen\wg@tmpc +\newdimen\wg@tmpd +% \end{macrocode} +% +% +% Macro to easy restore a saved path +% +% \begin{macrocode} +\def\settosave#1{ + \pgfsyssoftpath@setcurrentpath{#1}} +% \end{macrocode} +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% +% \subsubsection{Pictures in compound nodes} +% +% \begin{Macro}{\wg@pic} +% The macro \cs{wg@pic} will render a \texttt{pic}. This is used by +% the \texttt{natoapp6cs}, \texttt{chit}, and \texttt{hex} node +% shapes extensively. +% +% The arguments are +% \begin{enumerate} +% \item Prefix +% \item Position +% \item Fixed options +% \item User options +% \item Picture. +% \end{enumerate} +% +% That is, the macro expects calls like +% \begin{Syntax} +% \cs{wg@pic}\oarg{options}\meta{picture}\cs{@endwg@pic}\marg{prefix}\marg{position}\marg{options} +% \end{Syntax} +% +% Note the \cs{@endwg@pic} at the end of the call to swallow up +% \meta{picture}. Typically this macro is used as +% +% \begin{Syntax} +% \cs{edef}\cs{args}\{\meta{something}\} +% \cs{expandafter}\cs{wg@pic}\cs{args}\cs{@endwg@pic}\marg{prefix}\parg{position}\marg{options} +% \end{Syntax} +% +% where \meta{something} typically expands to \oarg{user +% option}\meta{picture} +% +% First, the top-level macro \cs{wg@pic} that looks for user +% options. +% +% \begin{macrocode} +\def\wg@pic{% + \@ifnextchar[{\wg@@pic}{\wg@@pic[]}%] +} +% \end{macrocode} +% +% This macro then forwards to \cs{wg@@pic} to gobble up +% \meta{picture}. +% +% \begin{enumerate} +% \item User options +% \item Arguments +% \end{enumerate} +% +% \begin{macrocode} +\def\wg@@pic[#1]#2\@endwg@pic{% + \wg@dbg{2}{Options: `#1', picture: `#2'}% + \wg@@@pic{#1}{#2}% +} +% \end{macrocode} +% +% \begin{enumerate} +% \item User options +% \item Arguments +% \item Prefix +% \item Coordinates +% \item Fixed options +% \end{enumerate} +% +% \begin{macrocode} +\def\wg@@@pic#1#2#3#4#5{% + \ifx|#2|\wg@dbg{3}{No picture given}% + \else% + \wg@dbg{3}{^^JWG Pic: + ^^J User options: #1 + ^^J Picture: #2 + ^^J Prefix: #3 + ^^J Coordinates: #4 + ^^J Fixed options: #5}% + % \wg@dbg{2}{\string\pic[#5,#1] at (#4) {#3#2}}% + \pic[#5,#1] at (#4) {#3#2};% + \ifwg@s@ve% + \pgf@relevantforpicturesizetrue% + \begin{getbbl}% + \pic[draw=none,fill=none,transform shape] at (#4) {#3#2};% + \end{getbbl}% + \wg@dbg{5}{Clipping to local bounding box}% + \clip (L.south west) rectangle (L.north east);% + \pgf@relevantforpicturesizefalse \global\wg@s@vefalse% + \fi + \fi% + \wg@dbg{3}{End of WG Pic} +} +% \end{macrocode} +% \end{Macro} +% +% +% \begin{Macro}{\wg@pic@all} +% +% This macro sets all pictures in a list. +% +% \begin{enumerate} +% \item List +% \item Prefix +% \item Position +% \item Styles +% \end{enumerate} +% +% +% \begin{macrocode} +\def\wg@pic@all#1#2#3#4{% + \wg@dbg{2}{WG picture loop + ^^J List: \meaning#1 + ^^J Prefix: `#2' + ^^J Position: `#3' + ^^J Styles: `#4'} + \foreach \p in #1{% + \wg@dbg{2}{WG picture element: \meaning\p}% + \expandafter\wg@pic\p\@endwg@pic {#2}{#3}{#4}% + }% +} +% \end{macrocode} +% \end{Macro} +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% +% \subsubsection{Nodes in compound nodes} +% +% \begin{Macro}{\wg@node} +% The macro \cs{wg@node} will render a \texttt{node}. This can be +% used by the \texttt{natoapp6cs}, \texttt{chit}, and \texttt{hex} +% node shapes. +% +% The arguments are +% \begin{enumerate} +% \item Prefix +% \item Position +% \item Fixed options +% \item User options +% \item Body. +% \end{enumerate} +% +% That is, the macro expects calls like +% \begin{Syntax} +% \cs{wg@node}\oarg{options}\meta{body}\cs{@endwg@node}\marg{prefix}\marg{position}\marg{options} +% \end{Syntax} +% +% Note the \cs{@endwg@node} at the end of the call to swallow up +% \meta{body}. Typically this macro is used as +% +% \begin{Syntax} +% \cs{edef}\cs{args}\{\meta{something}\} +% \cs{expandafter}\cs{wg@node}\cs{args}\cs{@endwg@node}\marg{prefix}\parg{position}\marg{options} +% \end{Syntax} +% +% where \meta{something} typically expands to \oarg{user +% option}\meta{body} +% +% First, the top-level macro \cs{wg@node} that looks for user +% options. +% +% \begin{macrocode} +\def\wg@node{% + \@ifnextchar[{\wg@@node}{\wg@@node[]}%] +} +% \end{macrocode} +% +% This macro then forwards to \cs{wg@@node} to gobble up +% \meta{body}. +% +% \begin{enumerate} +% \item User options +% \item Arguments +% \end{enumerate} +% +% \begin{macrocode} +\def\wg@@node[#1]#2\@endwg@node{% + \wg@dbg{2}{Options: `#1', body: `#2'}% + \wg@@@node{#1}{#2}% +} +% \end{macrocode} +% +% \begin{enumerate} +% \item User options +% \item Arguments +% \item Prefix +% \item Coordinates +% \item Fixed options +% \end{enumerate} +% +% \begin{macrocode} +\def\wg@@@node#1#2#3#4#5{% + \ifx|#2|\wg@dbg{3}{No body given}% + \else% + \wg@dbg{3}{^^JWG Pic: + ^^J User options: #1 + ^^J Body: #2 + ^^J Prefix: #3 + ^^J Coordinates: #4 + ^^J Fixed options: #5}% + % \wg@dbg{2}{\string\pic[#5,#1] at (#4) {#3#2}}% + \node[#5,#1] at (#4) {#3#2};% + \fi% + \wg@dbg{3}{End of WG Node} +} +% \end{macrocode} +% \end{Macro} +% +% +% \begin{Macro}{\wg@node@all} +% +% This macro sets all pictures in a list. +% +% \begin{enumerate} +% \item List +% \item Prefix +% \item Position +% \item Styles +% \end{enumerate} +% +% +% \begin{macrocode} +\def\wg@node@all#1#2#3#4{% + \wg@dbg{2}{WG picture loop + ^^J List: \meaning#1 + ^^J Prefix: `#2' + ^^J Position: `#3' + ^^J Styles: `#4'} + \foreach \p in #1{% + \wg@dbg{2}{WG picture element: \meaning\p}% + \expandafter\wg@node\p\@endwg@node {#2}{#3}{#4}% + }% +} +% \end{macrocode} +% \end{Macro} +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% +% \subsubsection{Bounding boxes} +% +% Bounding box dimensions +% +% +% \begin{macrocode} +\newdimen\wg@bb@minx +\newdimen\wg@bb@miny +\newdimen\wg@bb@maxx +\newdimen\wg@bb@maxy +% \end{macrocode} +% +% +% +% Enable or disable bounding box tracking +% +% \begin{macrocode} +\newif\ifwg@notrelevantforpathsize\wg@notrelevantforpathsizefalse +% \end{macrocode} +% +% +% \begin{Macro}{wg@resetbb} +% Reset the bounding box tracking dimensions +% +% \begin{macrocode} +\def\wg@resetbb{% + \global\wg@bb@minx=16000pt\relax% + \global\wg@bb@miny=16000pt\relax% + \global\wg@bb@maxx=-16000pt\relax% + \global\wg@bb@maxy=-16000pt\relax% +} +% \end{macrocode} +% \end{Macro} +% +% \begin{Macro}{\old@pgf@protocolsize} +% Save PGF's bounding box algorithm +% +% \begin{macrocode} +\let\old@pgf@protocolsize\pgf@protocolsizes +% \end{macrocode} +% \end{Macro} +% +% \begin{Macro}{\wg@protocolsizes} +% Our bounding box algorithm +% +% \begin{macrocode} +\def\wg@protocolsizes#1#2{% + \old@pgf@protocolsize{#1}{#2} + \ifwg@notrelevantforpathsize\else% + \ifdim#1<\wg@bb@minx\global\wg@bb@minx#1\fi% + \ifdim#1>\wg@bb@maxx\global\wg@bb@maxx#1\fi% + \ifdim#2<\wg@bb@miny\global\wg@bb@miny#2\fi% + \ifdim#2>\wg@bb@maxy\global\wg@bb@maxy#2\fi% + \fi +} +% \end{macrocode} +% \end{Macro} +% +% % \begin{environment}{getbbl} +% Environment that tracks the local bounding box +% +% \begin{macrocode} +\newenvironment{getbbl}{% + \wg@resetbb% + \wg@notrelevantforpathsizefalse% + \global\let\pgf@protocolsizes\wg@protocolsizes}{% + \gdef\pgf@sh@ns@L{rectangle} + \gdef\pgf@sh@np@L{% + \def\southwest{\pgfqpoint{\the\wg@bb@minx}{\the\wg@bb@miny}}% + \def\northeast{\pgfqpoint{\the\wg@bb@maxx}{\the\wg@bb@maxy}}% + } + \gdef\pgf@sh@nt@L{{1}{0}{0}{1}{0pt}{0pt}} + \gdef\pgf@sh@pi@L{\pgfpictureid} + \global\let\pgf@protocolsizes\old@pgf@protocolsize +} +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{getbb} +% Environment to track global bounding box +% +% \begin{macrocode} +\newenvironment{getbb}{% + \wg@resetbb% + \wg@notrelevantforpathsizefalse% + \global\let\pgf@protocolsizes\wg@protocolsizes}{% + \gdef\pgf@sh@ns@M{rectangle} + \gdef\pgf@sh@np@M{% + \def\southwest{\pgfqpoint{\the\wg@bb@minx}{\the\wg@bb@miny}}% + \def\northeast{\pgfqpoint{\the\wg@bb@maxx}{\the\wg@bb@maxy}}% + } + \gdef\pgf@sh@nt@M{{1}{0}{0}{1}{0pt}{0pt}} + % \pgfgettransform\pgf@temp% + % \xdef\pgf@sh@nt@M{\pgf@temp} + % \pgfgettransformentries{\wg@tmp@a}{\wg@tmp@b}{\wg@tmp@c}{\wg@tmp@d}{\pgf@temp}{\pgf@temp} + % \message{^^JTransform of M: \meaning\pgf@temp} + % \xdef\pgf@sh@nt@M{{\wg@tmp@a}{\wg@tmp@b}{\wg@tmp@c}{\wg@tmp@d}{0pt}{0pt}}% + % \message{^^JTransform of M: \meaning\pgf@sh@nt@M} + \gdef\pgf@sh@pi@M{\pgfpictureid} + \global\let\pgf@protocolsizes\old@pgf@protocolsize +} +% \end{macrocode} +% \end{environment} +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% +% \subsubsection{Other Tikz utilities} +% +% \begin{TikzKey}{tikz/reverseclip} +% +% A reverse clipping path. This is used to cut out stuff outside of +% path defined. +% +% \begin{macrocode} +\tikzstyle{reverseclip}=[insert path={(current bounding box.north east) -- + (current bounding box.south east) -- + (current bounding box.south west) -- + (current bounding box.north west) -- + (current bounding box.north east)}] +% \end{macrocode} +% \end{TikzKey} +% +% \begin{TikzKey}{tikz/clip even odd rule} +% A reverse clipping path +% +% \begin{macrocode} +\tikzset{ + clip even odd rule/.code={\pgfseteorule}, % Credit to Andrew Stacey +} +% \end{macrocode} +% \end{TikzKey} +% +% +% \begin{TikzKey}{tikz/invclip} +% +% Inverse clipping. This should be an option \emph{after} the path to +% do the inverse clipping by. This works by adding a \emph{large} +% (page) path to the current path, and then use that as clipping. +% +% \begin{macrocode} +\tikzset{ + invclip/.style={ + clip,insert path= + [clip even odd rule]{ + [reset cm](-\maxdimen,-\maxdimen)rectangle(\maxdimen,\maxdimen) + } + }, +} +% \end{macrocode} +% \end{TikzKey} +% +% \begin{TikzKey}{save clip} +% +% An option for use with sub-elements of NATO App 6(c) or chit +% nodes. This will save the current path as a clipping path for the +% next paths to be drawn in the sub-element +% +% \begin{macrocode} +\newif\ifwg@s@ve\wg@s@vefalse +\tikzset{ + save clip/.is choice, + save clip/true/.code={\global\wg@s@vetrue}, + save clip/false/.code={\global\wg@s@vefalse}, + save clip/.default={true}, + save clip/.initial={false}, +} +% \end{macrocode} +% \end{TikzKey} +% +% \begin{TikzKey}{scale line widths} +% +% Scales any line width specified in the node options. +% +% Use like +% +% \begin{verbatim} +% \tikzset{ +% some/.style={ +% scale line widths, +% line width=1pt} +% } +% \end{verbatim} +% +% Note that the order is important. +% +% \begin{macrocode} +\tikzset{ + scale line widths/.style={% + /utils/exec=\def\tikz@semiaddlinewidth##1{% + \pgfgettransformentries{% + \wg@jaca}{% + \wg@jacb}{% + \wg@jacc}{% + \wg@jacd}{% + \wg@tmp}{% + \wg@tmp}% + \pgfmathsetmacro{\wg@jac}{sqrt(abs(\wg@jaca*\wg@jacd-\wg@jacb*\wg@jacc))}% + \wg@dbg{4}{Scaling line width ##1 by \wg@jac} + \pgfmathsetmacro{\wg@lw}{\wg@jac*##1}% + \wg@dbg{4}{Scaled ##1 -> \wg@lw} + \tikz@addoption{\pgfsetlinewidth{\wg@lw pt}}% + \wg@dbg{4}{Added scaled option \wg@lw} + \pgfmathsetlength\pgflinewidth{\wg@lw pt} + \wg@dbg{4}{Did set line width \wg@lw pt} + }}, + relative line width/.style={% + /utils/exec=\def\tikz@semiaddlinewidth##1{% + \wg@dbg{4}{Relative line width #1 times ##1}% + \pgfmathsetmacro{\wg@lv}{#1*##1}% + \tikz@addoption{\pgfsetlinewidth{\wg@lw pt}}% + \pgfmathsetlength\pgflinewidth{\wg@lw pt}}} +} +% \end{macrocode} +% \end{TikzKey} +% +% \begin{TikzKey}{sub pic actions} +% +% This is key that propagates actions to sub pictures of pictures. +% The normal \texttt{pic actions} cannot be used as it causes an +% infinite loop. +% +% \begin{macrocode} +\tikzset{ + sub pic actions/.code={% + \tikz@picmode% + \edef\opts{% + \iftikz@mode@draw draw,\else draw=none,\fi + \iftikz@mode@fill fill\else fill=none\fi} + \wg@dbg{5}{^^JSub Mode: \meaning\tikz@picmode \meaning\opts} + \pgfset{/tikz/.cd} + \pgfkeysalsofrom{\opts} + }} +% \end{macrocode} +% \end{TikzKey} +% +% \begin{TikzKey}{wg/debug show} +% +% Show debugging information +% +% \begin{macrocode} +\tikzset{ + wg/debug show/.code={% + \extractcolorspec{pgfstrokecolor}{\wg@tmp@fg} + \def\wg@tmp@bg{none} + \@ifundefinedcolor{pgffillcolor}{}{ + \extractcolorspec{pgffillcolor}{\wg@tmp@bg}} + \begingroup + \tikz@mode + \wargamedbglvl=#1 + \wg@dbg{3}{Drawing with w/stroke `\wg@tmp@fg' + (\tikz@strokecolor,\iftikz@mode@draw\else not\space\fi drawing) + and fill `\wg@tmp@bg' (\tikz@fillcolor,\iftikz@mode@fill\else + not\space\fi filling)} + \endgroup + } +} +% \end{macrocode} +% \end{TikzKey} +% +% +% \iffalse +% -------------------------------------------------------------------- +% \fi +% +% \subsubsection{Random IDs} +% +% +% \begin{macrocode} +\def\wg@r@ndom@id{% + \def\wg@uuid{} + \foreach \i in {1,...,8}{% + \pgfmathparse{Hex(random(0,15))} + \xdef\wg@uuid{\wg@uuid\pgfmathresult}}} +% \end{macrocode} +% +% \iffalse +%</utils> +%\fi +% \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": "<<eol>>", + "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). +% +% \begin{macrocode} +\newcommand\chitimages[2][]{% + \begingroup% + \let\chit@report\do@chit@report% + \let\natoapp@report\do@natoapp@report% + \chit@dbg{2}{chits to make images of `#2'}% + \foreach[count=\ti from 0] \t/\x in #2{% + \ifx\t\empty\else% Ignore empty rows + \message{^^JSubcategory: `\x' (default `#1')} + \ifx\t\x\def\x{#1}\fi% Take sub-category or default + \foreach \u/\m in \t{% + \ifx\u\empty\else% Ignore empty cells + \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'}% + %% We only make one copy of the chit, since we can duplicate + %% it in VASSAL + \info*{\u}{counter}{\x} + \begin{tikzpicture} + \chit[\u=\ti]% + \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% + }% + \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 +% +% \begin{macrocode} +\newcommand\doublechitimages[2][]{% + \begingroup% + \let\chit@report\do@chit@report% + \let\natoapp@report\do@natoapp@report% + \foreach[count=\ti from 0] \t/\x in #2{% + \ifx\t\empty\else% Ignore empty rows + \message{^^JSubcategory: `\x' (default `#1')} + \ifx\t\x\def\x{#1}\fi% Take sub-category or default + \foreach \u/\m in \t{% + \ifx\u\empty\else% Ignore empty cells + \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}% + \begin{tikzpicture}% + \chit[\u=\ti]% + \end{tikzpicture}% + \end@info% + \info*{\s}{counter}{\x}% + \begin{tikzpicture}% + \chit[\s=\ti]% + \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% + }% + \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}). +% +% All coordinates, and such are recorded in centimetres. It is worth +% remembering that the Tikz coordinate system has the $y$ axis point +% upward, while typical image software has the $y$ axis point down. +% \texttt{pdftocairo} typically assumes a 150 PPI (pixels-per-inch) +% resolution. +% +% That means that scaling factor becomes +% +% $$\frac{150\mathrm{pixel}}{2.54\mathrm{cm}}=59.055\frac{\mathrm{pixel}}{\mathrm{cm}}$$ +% +% \iffalse +% Using definition in terms of printers feet - the one to use! +% +% PNG: 1674 x 1101 +% PDF: "lower left": [-0.02107,-0.02107], +% "upper right": [28.31705,18.60843] +% Width: 28.31705+0.02107 = 28.33812 +% Height: 18.60843+0.02107 = 18.62950 +% Pixel / cm: 1674 / 28.33812 = 59.07237318495369488166 +% 1101 / 18.62950 = 59.09981480984460130438 +% Average = 59.08609399739914809302 +% +% Calculated = 150 / 2.54 = 59.05511811023622047244 +% +% Using 1/72.27 +% +% "lower left": [-0.02109,-0.02109], +% "upper right": [28.321,18.61102] +% Width: 28.321+0.02109=28.34209 +% Height: 18.61102+0.02109=18.63211 +% Pixel / cm: 1674 / 28.34209 = 59.06409866033168337267 +% 1101 / 18.63211 = 59.09153606328000425072 +% Average = 59.07781736180584381169 +% \fi +% +% 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. +% +% Since we want to write all dimensions in centimetres, we need to be +% able to convert \texttt{pt} dimensions to centimetres. We make two +% macros to do that for us. +% +% The exact definition of 1pt is +% +% $$1\,\mathrm{pt} = \frac{249}{250}12"\frac{1}{864}=\frac{83}{6000}1" +% = 0.03513\overline{6}$$ +% +% \begin{macrocode} +% 2.54 / 72.27 = .03514598035145980351 +% \def\pt@to@cm#1{\pgfmathparse{#1 * 0.0351460}} +\def\pt@to@cm#1{\pgfmathparse{#1 * 0.0351367}} +\def\ptpoint@to@cm#1#2{% + \pt@to@cm{#1}\edef\x{\pgfmathresult}% + \pt@to@cm{#2}\edef\y{\pgfmathresult}} +% \end{macrocode} +% \begin{macrocode} +\def\get@bb#1{% + \pgfpointanchor{#1}{south west}% + \pgfgetlastxy\tmp@llx\tmp@lly% + \pgfpointanchor{#1}{north east}% + \pgfgetlastxy\tmp@urx\tmp@ury% + \pt@to@cm{\tmp@llx}\edef\llx{\pgfmathresult} + \pt@to@cm{\tmp@lly}\edef\lly{\pgfmathresult} + \pt@to@cm{\tmp@urx}\edef\urx{\pgfmathresult} + \pt@to@cm{\tmp@ury}\edef\ury{\pgfmathresult}} +% \end{macrocode} +% \begin{macrocode} +\def\mk@transform{% + \pgfgettransformentries{\mxx}{\mxy}{\myx}{\myy}{\ptdx}{\ptdy} + \pt@to@cm{\ptdx}\edef\dx{\pgfmathresult} + \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{% + \get@bb{#1} + \mk@w{ \mk@i "lower left": [\llx,\lly],} + \mk@w{ \mk@i "upper right": [\urx,\ury],} + \begingroup + % \pgftransforminvert + \pgfpointanchor{#1}{south west}% + \pgfgetlastxy\tmp@llx\tmp@lly% + \pgfpointtransformed{\pgfpoint{\tmp@llx}{\tmp@lly}} + \pgf@xa=\pgf@x + \pgf@ya=\pgf@y + % + \pgfpointanchor{#1}{north east}% + \pgfgetlastxy\tmp@urx\tmp@ury% + \pgfgetlastxy\tmp@llx\tmp@lly% + \pgfpointtransformed{\pgfpoint{\tmp@urx}{\tmp@ury}} + \pgf@xb=\pgf@x + \pgf@yb=\pgf@y + \pt@to@cm{\the\pgf@xa}\edef\llx{\pgfmathresult} + \pt@to@cm{\the\pgf@ya}\edef\lly{\pgfmathresult} + \pt@to@cm{\the\pgf@xb}\edef\urx{\pgfmathresult} + \pt@to@cm{\the\pgf@yb}\edef\ury{\pgfmathresult}x + \mk@w{ \mk@i "global lower left": [\llx,\lly],} + \mk@w{ \mk@i "global upper right": [\urx,\ury]} + \endgroup +} +% \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% +% \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}{<<dummy>>}{}% + %\tikz{}% + \tikz{\scoped[every hex/.try,every hex node/.try]{% + \node[inner sep=0,outer sep=0]{% + \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",} + \message{^^Jlabel: \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}{ + \advance\mk@point1 + \global\mk@point=\mk@point + \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 + \pt@to@cm{\the\pgf@xa}\edef\px{\pgfmathresult} + \pt@to@cm{\the\pgf@ya}\edef\py{\pgfmathresult} + \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} + }, +% \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} +% +% +% TO BE DONE: We could add hooks to both the \texttt{hex} and +% \texttt{chit} shapes 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. For +% example, we could write a counters +% +% \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} +% +% 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. Not +% sure how to use it though. +% +% \begin{macrocode} +\tikzset{ + zone turn/.store in=\zone@turn, + zone mult/.store in=\zone@mult +} +\def\do@chit@report{% + \mk@w{ \mk@i "chit": \@lbchar} + \@ifundefined{id}{} {\mk@w{ \mk@i\space "id": "\id", }}% + \@ifundefined{chit@symbol}{} {\mk@w{ \mk@i\space "symbol": "true", }}% + \@ifundefined{chit@full}{} {\mk@w{ \mk@i\space "full": "\chit@full", }} + \@ifundefined{chit@factors}{} {\mk@w{ \mk@i\space "factors": "\chit@factors", }}% + \@ifundefined{chit@left}{} {\mk@w{ \mk@i\space "left": "\chit@left", }}% + \@ifundefined{chit@right}{} {\mk@w{ \mk@i\space "right": "\chit@right", }}% + \@ifundefined{chit@upper@left}{} {\mk@w{ \mk@i\space "upper left": "\chit@upper@left", }}% + \@ifundefined{chit@lower@left}{} {\mk@w{ \mk@i\space "lower left": "\chit@lower@left", }}% + \@ifundefined{chit@upper@right}{}{\mk@w{ \mk@i\space "upper right": "\chit@upper@right", }}% + \@ifundefined{chit@lower@right}{}{\mk@w{ \mk@i\space "lower right": "\chit@lower@right}", }% + \mk@w{ \mk@i\space "end": 0} + \@ifundefined{chit@symbol}{ + \mk@w{ \mk@i \@rbchar } + }{ + \mk@w{ \mk@i \@rbchar, }% NATOAPP6c will follow + }% +} +\def\do@natoapp@report{% + \mk@w{ \mk@i "natoapp6c": \@lbchar} + \@ifundefined{id}{}{\mk@w{ \mk@i\space "id": "\id", }} + \@ifundefined{natoapp@fac}{}{\mk@w{ \mk@i\space "faction": "\natoapp@fac", }} + \@ifundefined{natoapp@cmd}{}{\mk@w{ \mk@i\space "command": "\natoapp@cmd", }} + \@ifundefined{natoapp@ech}{}{\mk@w{ \mk@i\space "echelon": "\natoapp@ech", }} + \@ifundefined{natoapp@main}{}{\mk@w{ \mk@i\space "main": "\natoapp@main", }} + \@ifundefined{natoapp@left}{}{\mk@w{ \mk@i\space "left": "\natoapp@left", }} + \@ifundefined{natoapp@right}{}{\mk@w{ \mk@i\space "right": "\natoapp@right", }} + \@ifundefined{natoapp@upper}{}{\mk@w{ \mk@i\space "upper": "\natoapp@upper", }} + \@ifundefined{natoapp@lower}{}{\mk@w{ \mk@i\space "lower": "\natoapp@lower", }} + \@ifundefined{natoapp@below}{}{\mk@w{ \mk@i\space "below": "\natoapp@below", }} + \mk@w{ \mk@i\space "end": 0} + \mk@w{ \mk@i \@rbchar} +} +% \end{macrocode} +% \iffalse +%</exportcls> +%\fi +% diff --git a/macros/latex/contrib/wargame/source/utils/export.py b/macros/latex/contrib/wargame/source/utils/export.py new file mode 100755 index 0000000000..b60cbb0fc5 --- /dev/null +++ b/macros/latex/contrib/wargame/source/utils/export.py @@ -0,0 +1,3562 @@ +#!/usr/bin/env python +# +from pprint import pprint + +# ==================================================================== +def add_pws(opw=None,upw=None): + '''Add password options to the poppler commands + + Parameters + ---------- + opw : str + Owner password + upw : str + User password + + Returns + ------- + opts : list + List of arguments + ''' + args = [] + if upw is not None: + args.extend(['-upw',upw]) + + if opw is not None: + args.extend(['-opw',opw]) + + return args + +# -------------------------------------------------------------------- +def create_proc(args): + '''Create a process + + Parameters + ---------- + args : list + List of commmand line arguments + + Returns + ------- + proc : subprocess.Process + Process handle + ''' + from os import environ + from subprocess import Popen, PIPE, TimeoutExpired + + return Popen(args,env=environ.copy(),stdout=PIPE,stderr=PIPE) + +# -------------------------------------------------------------------- +def get_pdf_info(pdfname='export.pdf',upw=None,opw=None,timeout=None): + '''Get dictionary of PDF information + + Parameters + ---------- + pdfname : str + File name + opw : str + Owner password + upw : str + User password + timeout : int + Timeout in seconds or None + + Returns + ------- + info : dict + PDF information + ''' + from subprocess import TimeoutExpired + + args = ['pdfinfo', pdfname] + args.extend(add_pws(opw=opw,upw=upw)) + + proc = create_proc(args) + + try: + out, err = proc.communicate(timeout=timeout) + except Exception as e: + proc.kill() + proc.communicate() + raise RuntimeError(f'Failed to get PDF info: {e}') + + d = {} + for field in out.decode("utf8", "ignore").split("\n"): + sf = field.split(":") + key, value = sf[0], ":".join(sf[1:]) + if key != "": + d[key] = (int(value.strip()) if key == 'Pages' else value.strip()) + + if "Pages" not in d: + raise ValueError + + return d + +# -------------------------------------------------------------------- +def get_images_info(infofile): + '''Read in image information from file + + Parameters + ---------- + infofile : str + file name + + Returns + ------- + images : list + List of image information + ''' + #from csv import DictReader + from json import load + + with open(infofile,'r') as file: + info = load(file) + #reader = DictReader(file,fieldnames=['page','name','type','sub type']) + #return [l for l in reader] + + return info + + +# -------------------------------------------------------------------- +def convert_page(pdfname,page,opw=None,upw=None,timeout=None): + '''Convert a single PDF page to an image + + Parameters + ---------- + pdfname : str + File name + page : int + Page number + opw : str + Owner password + upw : str + User password + timeout : int + Timeout in seconds or None + + Returns + ------- + img : bytes + The bytes of the image + ''' + args = ['pdftocairo', + '-singlefile', + '-f', str(page), + '-l', str(page), + '-png'] + args.extend(add_pws(opw=opw,upw=upw)) + args.append(pdfname) + args.append('-') + + proc = create_proc(args) + + try: + out, err = proc.communicate(timeout=timeout) + except Exception as e: + proc.kill() + proc.communicate() + raise RuntimeError(f'Failed to convert page {page} of {pdfname}: {e}') + + from io import BytesIO + from PIL import Image + + img = out #Image.open(BytesIO(out)) + + return img + +# -------------------------------------------------------------------- +def ignore_entry(entry): + return entry['category'] in ['<<dummy>>','<<eol>>'] + +# -------------------------------------------------------------------- +def convert_pages(pdfname,infoname, + opw=None,upw=None,timeout=None): + '''Convert pages in a PDF to images + + This creates a list of dictionaries with the image name and data + (as bytes) + + Parameters + ---------- + pdfname : str + File name of PDF to read images from + infoname : str + File name of CSV to read image info from + opw : str + Owner password + upw : str + User password + timeout : int + Timeout in seconds or None + + Returns + ------- + imgs : list + List of images as dicts, info and the bytes of the images + ''' + + oargs = {'opw':opw,'upw':upw,'timeout':timeout} + docinfo = get_pdf_info(pdfname,**oargs) + info = get_images_info(infoname) + + if len(info)-1 != docinfo['Pages']: + raise RuntimeError(f'Number of pages in {pdfname} ' + f'({docinfo["Pages"]}) not {len(info)-1}') + + for i in info: + if ignore_entry(i): continue + i['img'] = convert_page(pdfname,i['number'],**oargs) + + return info + +# ==================================================================== +def remove_and_get(zipfname,*filenames): + '''Open zip file, and make a copy of it without the files listed + in entries. Return the data of files listed in entry.''' + from tempfile import mkdtemp + from zipfile import ZipFile + from shutil import move, rmtree + from os import path + + tempdir = mkdtemp() + ret = {} + try: + tempname = path.join(tempdir, 'new.zip') + with ZipFile(zipfname, 'r') as zipread: + + with ZipFile(tempname, 'w') as zipwrite: + + for item in zipread.infolist(): + data = zipread.read(item.filename) + + if item.filename not in filenames: + zipwrite.writestr(item, data) + else: + ret[item.filename] = data + + move(tempname, zipfname) + finally: + rmtree(tempdir) + + return ret + +# -------------------------------------------------------------------- +def add_back(zipfname,files): + '''Open a zip file for appending and add data in files + + Files is a dictionary of filenames mapping to file content, + as returned by remove_and_get + ''' + from zipfile import ZipFile + + with ZipFile(zipfname, 'a') as zipadd: + for filename,data in files.items(): + zipadd.writestr(filename,data) + +# ==================================================================== +# Contants used for tag names +BUILD = 'VASSAL.build.' +MODULE = BUILD + 'module.' +WIDGET = BUILD + 'widget.' +MAP = MODULE + 'map.' +PICKER = MAP + 'boardPicker.' + +# ==================================================================== +def get_asdict(elem,tag,key,enable=True): + cont = elem.getElementsByTagName(tag) + if not enable: + return cont + + return {e.getAttribute(key): e for e in cont} + +# -------------------------------------------------------------------- +def get_asone(elem,tag,enable=True): + cont = elem.getElementsByTagName(tag) + if enable and len(cont) != 1: + return None + return cont + +# -------------------------------------------------------------------- +def get_doc(string): + from xml.dom.minidom import parseString + + return parseString(string) + +# -------------------------------------------------------------------- +def get_game(doc): + return doc.getElementsByTagName('VASSAL.build.GameModule')[0] + +# -------------------------------------------------------------------- +def get_documentation(doc,one=True): + return get_asone(doc,MODULE+'Documentation',one) + +# -------------------------------------------------------------------- +def get_helpfiles(doc,key='fileName',asdict=True): + return get_asdict(doc,MODULE+'documentation.HelpFile',key,asdict) + +# -------------------------------------------------------------------- +def get_inventories(doc,key='name',asdict=False): + return get_asdict(doc,MODULE+'Inventory',key,asdict) + +# -------------------------------------------------------------------- +def get_maps(doc,asdict=True): + return get_asdict(doc,MODULE+'Map','mapName',asdict) + +# -------------------------------------------------------------------- +def get_widgetmap(doc,asdict=True): + return get_asdict(doc,WIDGET+'WidgetMap','mapName',asdict) + +# -------------------------------------------------------------------- +def get_chartwindows(doc,asdict=True): + return get_asdict(doc,MODULE+'ChartWindow','name',asdict) + +# -------------------------------------------------------------------- +def get_map(doc,name): + maps = get_maps(doc,True) + return maps.get(name, None) if maps else None + +# -------------------------------------------------------------------- +def get_boards(doc,asdict=True): + return get_asdict(doc,PICKER+'Board','name',asdict) + +# -------------------------------------------------------------------- +def get_zoned(doc,one=True): + return get_asone(doc,PICKER+'board.ZonedGrid',one) + +# -------------------------------------------------------------------- +def get_zone(doc,asdict=True): + return get_asdict(doc,PICKER+'board.mapgrid.Zone','name',asdict) + +# -------------------------------------------------------------------- +def get_hexgrid(doc,one=True): + return get_asone(doc,PICKER+'board.HexGrid',one) + +# -------------------------------------------------------------------- +def get_squaregrid(doc,one=True): + return get_asone(doc,PICKER+'board.SquareGrid',one) + +# -------------------------------------------------------------------- +def get_regiongrid(doc,one=True): + return get_asone(doc,PICKER+'board.RegionGrid',one) + +# -------------------------------------------------------------------- +def get_hexnumbering(doc,one=True): + return get_asone(doc,PICKER+'board.mapgrid.HexGridNumbering',one) + +# -------------------------------------------------------------------- +def get_regions(doc,asdict=True): + return get_asdict(doc,PICKER+'board.Region', 'name', asdict) + +# -------------------------------------------------------------------- +def get_squarenumbering(doc,one=True): + return get_asone(doc,PICKER+'board.mapgrid.SquareGridNumbering', one) + +# -------------------------------------------------------------------- +def get_pieces(doc,asdict=True): + return get_asdict(doc,WIDGET+'PieceSlot','entryName',asdict) + +# -------------------------------------------------------------------- +def get_prototypes(doc,asdict=True): + return get_asdict(doc,MODULE+'PrototypeDefinition', 'name',asdict) + +# -------------------------------------------------------------------- +def get_masskey(map,asdict=True): + return get_asdict(map,MAP+'MassKeyCommand','name', asdict) + +# -------------------------------------------------------------------- +def get_masskey(map,asdict=True): + return get_asdict(map,MAP+'MassKeyCommand','name', asdict) + + +# -------------------------------------------------------------------- +def get_piece_parts(code): + '''Takes the code part of a pieceslot (the text node) and decodes + it into traits. + + One can use this to modify the pieces. One could for example + remove a trait by calling this function, and remove the element + corresponding to the trait from the returned list. Then one must + collect up the definitions and states separately and pass each of + them to `enc_parts', which gives us two strings that can be passed + to `add_piece' (or `add_proto') function to get the new text node + content of the piece slot or prototype definition. For example + + piece = get_pieceslots(root,pieces)['foo'] + code = piece.childNodes[0].nodeValue + traits = get_piece_parts(code) + ... # Modify the list + + # Separate out definitions and states + defs = [enc_def(e['def']) for e in traits] + states = [enc_def(e['state']) for e in traits] + + # Encode definitions and states as a single string, and then form body + def = enc_parts(*defs) + state = enc_parts(*states) + body = add_piece(def,state) + + # Set new definition + piece.childNodes[0].nodeValue = body + + See also dicts_to_piece + + Parameters + ---------- + code : str + Text node content of <PieceSlot> or <PrototypeDefinition> tags + + Returns + ------- + traits : list of dict + All the traits in a list. Each element of the list is a + dictionary with the keys 'def' and 'status'. + + The key 'def' points to a list of the trait attributes used to + define the trait type. The first element of the 'def' list is + the trait identifier. The rest are the arguments for that + trait type. Note, all fields are encoded as strings. + + The key 'status' encodes the status of the trait. The format + of this depends on the trait.Note, all fields are encoded as + strings. + + ''' + cmd,iden,typ,sta = code.split('/') + defs = typ.split(r' ') + stas = sta.split(r' ') + defs = [d.rstrip("\\").split(';') for d in defs] + stas = [s.rstrip("\\").split(';') for s in stas] + ret = [{'def': d, 'state': s} for d,s in zip(defs,stas)] + return ret + +# -------------------------------------------------------------------- +def dicts_to_piece(traits): + # Separate out definitions and states + defs = [enc_def(e['def']) for e in traits] + states = [enc_def(e['state']) for e in traits] + + # Encode definitions and states as a single string, and then form body + df = enc_parts(*defs) + state = enc_parts(*states) + body = add_piece(df,state) + + return body + + +# ==================================================================== +# Key encoding +CTRL = 130 +ALT = 520 +def key(let,mod=CTRL): + + '''Encode a key sequence + + Parameters + ---------- + let : str + Key code (Letter) + mod : int + Modifier mask + ''' + return f'{ord(let)},{mod}' +# Colour encoding +def rgb(r,g,b): + return ','.join([str(r),str(g),str(b)]) + +def rgba(r,g,b,a): + return ','.join([str(r),str(g),str(b),str(a)]) + + +# -------------------------------------------------------------------- +def set_node_attr(node,**attr): + for k,v in attr.items(): + node.setAttribute(k,str(v).lower() if isinstance(v,bool) else str(v)) + +# -------------------------------------------------------------------- +def add_node(root,parent,tag,**attr): + e = root.createElement(tag) + if parent: parent.appendChild(e) + set_node_attr(e,**attr) + + return e + + +# -------------------------------------------------------------------- +def add_text(root,parent,text): + t = root.createTextNode(text) + parent.appendChild(t) + return t + +# -------------------------------------------------------------------- +def add_game(root,doc, + name, + version, + ModuleOther1 = "", + ModuleOther2 = "", + VassalVersion = "3.6.7", + description = "", + nextPieceSlotId = 0): + return add_node(root,doc,BUILD+'GameModule', + name = name, + version = version, + ModuleOther1 = ModuleOther1, + ModuleOther2 = ModuleOther2, + VassalVersion = VassalVersion, + description = description, + nextPieceSlotId = nextPieceSlotId) + +# -------------------------------------------------------------------- +def add_basiccommandencoder(root,doc): + return add_node(root,doc,MODULE+'BasicCommandEncoder') + +# -------------------------------------------------------------------- +def add_globalproperties(root,elem): + return add_node(root,elem,MODULE+'properties.GlobalProperties') + +# -------------------------------------------------------------------- +def add_translatable(root,elem): + return add_node(root,elem,MODULE+'properties.GlobalTranslatableMessages') + +# -------------------------------------------------------------------- +def add_language(root,elem): + return add_node(root,elem,'VASSAL.i18n.Language') + +# -------------------------------------------------------------------- +def add_chatter(root,elem): + return add_node(root,elem,MODULE+'Chatter') + +# -------------------------------------------------------------------- +def add_keynamer(root,elem): + return add_node(root,elem,MODULE+'KeyNamer') + +# -------------------------------------------------------------------- +def add_documentation(root,doc): + return add_node(root,doc,MODULE+'Documentation') + +# -------------------------------------------------------------------- +def add_about(root,doc,title,fileName=""): + return add_node(root,doc,MODULE+'documentation.AboutScreen', + fileName = fileName, + title = title) +# -------------------------------------------------------------------- +def add_pdffile(root,doc,title,pdfFile): + return add_node(root,doc,MODULE+'documentation.BrowserPDFFile', + pdfFile = pdfFile, title=title) +# -------------------------------------------------------------------- +def add_helpfile(root,doc,title,fileName,fileType="archive"): + return add_node(root,doc,MODULE+'documentation.HelpFile', + fileName = fileName, + fileType = fileType, + title = title) + +# -------------------------------------------------------------------- +def add_htmlfile(root,doc,title,startingPage='index.html'): + return add_node(root,doc,MODULE+'documentation.BrowserHelpFile', + startingPage=startingPage, + title=title) + +# -------------------------------------------------------------------- +def add_roster(root,doc,buttonKeyStroke='', + buttonText='Retire', + buttonToolTip='Switch sides, become observer, or release faction'): + return add_node(root,doc,MODULE+'PlayerRoster', + buttonKeyStroke = buttonKeyStroke, + buttonText = buttonText, + buttonToolTip = buttonToolTip) + +# -------------------------------------------------------------------- +def add_entry(root,doc,text): + n = add_node(root,doc,'entry') + add_text(root,n,text) + return n + +# -------------------------------------------------------------------- +def add_globaloptions(root,doc, + autoReport = "Use Preferences Setting", + centerOnMove = "Use Preferences Setting", + chatterHTMLSupport = "Always", + hotKeysOnClosedWindows = "Never", + inventoryForAll = "Always", + nonOwnerUnmaskable = "Use Preferences Setting", + playerIdFormat = "$playerName$", + promptString = "Opponents can unmask pieces", + sendToLocationMoveTrails = "Never"): + return add_node(root,doc,MODULE+'GlobalOptions', + autoReport = autoReport, + centerOnMove = centerOnMove, + chatterHTMLSupport = chatterHTMLSupport, + hotKeysOnClosedWindows = hotKeysOnClosedWindows, + inventoryForAll = inventoryForAll, + nonOwnerUnmaskable = nonOwnerUnmaskable, + playerIdFormat = playerIdFormat, + promptString = promptString, + sendToLocationMoveTrails = sendToLocationMoveTrails) + +# -------------------------------------------------------------------- +def add_option(root,doc,name,value): + n = add_node(root,doc,'option',name=name) + add_text(n,root,value) + return n + +# -------------------------------------------------------------------- +# CurrentMap == "Board" +def add_inventory(root,doc, + canDisable = False, + centerOnPiece = True, + disabledIcon = '', + drawPieces = True, + foldersOnly = False, + forwardKeystroke = True, + groupBy = '', + hotkey = key('I'), + icon = '/images/inventory.gif', + include = '{}', + launchFunction = 'functionHide', + leafFormat = '$PieceName$', + name = '', + nonLeafFormat = '$PropertyValue$', + pieceZoom = '0.33', + pieceZoom2 = '0.5', + pieceZoom3 = '0.6', + propertyGate = '', + refreshHotkey = key('I',195), + showMenu = True, + sides = '', + sortFormat = '$PieceName$', + sortPieces = True, + sorting = 'alpha', + text = '', + tooltip = 'Show inventory of all pieces', + zoomOn = False): + return add_node(root,doc,MODULE+'Inventory', + canDisable = canDisable, + centerOnPiece = centerOnPiece, + disabledIcon = disabledIcon, + drawPieces = drawPieces, + foldersOnly = foldersOnly, + forwardKeystroke = forwardKeystroke, + groupBy = groupBy, + hotkey = hotkey, + icon = icon, + include = include, + launchFunction = launchFunction, + leafFormat = leafFormat, + name = name, + nonLeafFormat = nonLeafFormat, + pieceZoom = pieceZoom, + pieceZoom2 = pieceZoom2, + pieceZoom3 = pieceZoom3, + propertyGate = propertyGate, + refreshHotkey = refreshHotkey, + showMenu = showMenu, + sides = sides, + sortFormat = sortFormat, + sortPieces = sortPieces, + sorting = sorting, + text = text, + tooltip = tooltip, + zoomOn = zoomOn) + + + +# -------------------------------------------------------------------- +def add_map(root,doc, + mapName, + allowMultiple = 'false', + backgroundcolor = rgb(255,255,255), + buttonName = '', + changeFormat = '$message$', + color = rgb(0,0,0), + createFormat = '$pieceName$ created in $location$ *', + edgeHeight = '0', + edgeWidth = '0', + hideKey = '', + hotkey = key('M',ALT), + icon = '/images/map.gif', + launch = 'false', + markMoved = 'Always', + markUnmovedHotkey = '', + markUnmovedIcon = '/images/unmoved.gif', + markUnmovedReport = '', + markUnmovedText = '', + markUnmovedTooltip = 'Mark all pieces on this map as not moved', + moveKey = '', + moveToFormat = '$pieceName$ moves $previousLocation$ &rarr; $location$ *', + moveWithinFormat = '$pieceName$ moves $previousLocation$ &rarr; $location$ *', + showKey = '', + thickness = '3', + cls = MODULE+'Map'): + return add_node(root,doc,cls, + allowMultiple = allowMultiple, + backgroundcolor = backgroundcolor, + buttonName = buttonName, + changeFormat = changeFormat, + color = color, + createFormat = createFormat, + edgeHeight = edgeHeight, + edgeWidth = edgeWidth, + hideKey = hideKey, + hotkey = hotkey, + icon = icon, + launch = launch, + mapName = mapName, + markMoved = markMoved, + markUnmovedHotkey = markUnmovedHotkey, + markUnmovedIcon = markUnmovedIcon, + markUnmovedReport = markUnmovedReport, + markUnmovedText = markUnmovedText, + markUnmovedTooltip = markUnmovedTooltip, + moveKey = moveKey, + moveToFormat = moveToFormat, + moveWithinFormat = moveWithinFormat, + showKey = showKey, + thickness = thickness) + +# -------------------------------------------------------------------- +def add_widgetmap(root,doc, mapName,**attr): + return add_map(root,doc,mapName,cls=WIDGET+'WidgetMap',**attr) + +# -------------------------------------------------------------------- +def add_boardpicker(root,doc, + addColumnText = 'Add column', + addRowText = 'Add row', + boardPrompt = 'Select board', + slotHeight = 125, + slotScale = 0.2, + slotWidth = 350, + title = 'Choose Boards'): + return add_node(root,doc,MAP+'BoardPicker', + addColumnText = addColumnText, + addRowText = addRowText, + boardPrompt = boardPrompt, + slotHeight = slotHeight, + slotScale = slotScale, + slotWidth = slotWidth, + title = title) + +# -------------------------------------------------------------------- +def add_setup(root,picker,mapName,maxColumns,boardNames): + '''Add given boards in row-first up to maxColumns per row''' + s = add_node(root,picker,'setup') + col = 0 + row = 0 + lst = [f'{mapName}BoardPicker'] + for bn in boardNames: + lst.extend([bn,str(col),str(row)]) + col += 1 + if col >= maxColumns: + col = 0 + row += 1 + txt = r' '.join(lst) + add_text(root,s,txt) + +# -------------------------------------------------------------------- +def add_board(root,picker,name, + image = '', + reversible = False, + color = rgb(255,255,255), + width = 0, + height = 0): + return add_node(root,picker,PICKER+'Board', + image = image, + name = name, + reversible = reversible, + color = color, + width = width, + height = height) + +# -------------------------------------------------------------------- +def add_zoned(root,board): + return add_node(root,board,PICKER+'board.ZonedGrid') + +# -------------------------------------------------------------------- +def add_zonehighlighter(root,zoned): + return add_node(root,zoned,PICKER+'board.mapgrid.ZonedGridHighlighter') + +# -------------------------------------------------------------------- +def add_zone(root,zoned, + name = "", + highlightProperty = "", + locationFormat = "$gridLocation$", + path = "0,0;976,0;976,976;0,976", + useHighlight = False, + useParentGrid = False): + return add_node(root,zoned,PICKER+'board.mapgrid.Zone', + name = name, + highlightProperty = highlightProperty, + locationFormat = locationFormat, + path = path, + useHighlight = useHighlight, + useParentGrid = useParentGrid) + +# -------------------------------------------------------------------- +HEX_WIDTH = 88.50779626676963 +HEX_HEIGHT = 102.2 +def add_hexgrid(root,zone, + color = rgb(0,0,0), + cornersLegal = False, + dotsVisible = False, + dx = HEX_WIDTH, + dy = HEX_HEIGHT, + edgesLegal = False, + sideways = False, + snapTo = True, + visible = True, + x0 = 0, + y0 = 32, + cls = PICKER+'board.HexGrid'): + return add_node(root,zone,cls, + color = color, + cornersLegal = cornersLegal, + dotsVisible = dotsVisible, + dx = dx, + dy = dy, + edgesLegal = edgesLegal, + sideways = sideways, + snapTo = snapTo, + visible = visible, + x0 = x0, + y0 = y0) + +# -------------------------------------------------------------------- +def add_hexnumbering(root,grid, + color = rgb(255,0,0), + first = 'H', + fontSize = 24, + hDescend = False, + hDrawOff = 0, + hLeading = 1, + hOff = 0, + hType = 'A', + locationFormat = '$gridLocation$', + rotateText = 0, + sep = '', + stagger = True, + vDescend = False, + vDrawOff = 32, + vLeading = 0, + vOff = 0, + vType = 'N', + visible = True, + cls = PICKER+'board.mapgrid.HexGridNumbering'): + return add_node(root,grid,cls, + color = color, + first = first, + fontSize = fontSize, + hDescend = hDescend, + hDrawOff = hDrawOff, + hLeading = hLeading, + hOff = hOff, + hType = hType, + locationFormat = locationFormat, + rotateText = rotateText, + sep = sep, + stagger = stagger, + vDescend = vDescend, + vDrawOff = vDrawOff, + vLeading = vLeading, + vOff = vOff, + vType = vType, + visible = visible) + +# -------------------------------------------------------------------- +RECT_WIDTH = 80 +RECT_HEIGHT = 80 +def add_squaregrid(root,zone, + dx = RECT_WIDTH, + dy = RECT_HEIGHT, + edgesLegal = False, + x0 = 0, + y0 = int(0.4*RECT_HEIGHT), + **attr): + return add_hexgrid(root,zone,cls=PICKER+'board.SquareGrid', + dx = dx, + dy = dy, + edgesLegal = edgesLegal, + x0 = x0, + y0 = y0, + **attr) + +# -------------------------------------------------------------------- +def add_squarenumbering(root,grid, + hType = 'N', + **attr): + return add_hexnumbering(root,grid, + cls=PICKER+'board.mapgrid.SquareGridNumbering', + hType = hType, + **attr) + +# -------------------------------------------------------------------- +def add_regiongrid(root,zone,snapto=True,fontsize=9,visible=True): + print(f'Make region grid visible: {visible}') + return add_node(root,zone,PICKER+'board.RegionGrid', + fontsize = fontsize, + snapto = snapto, + visble = visible) + +# -------------------------------------------------------------------- +def get_region_piece(root,grid,name,alsoPiece=True,piece=None,verbose=False): + if not alsoPiece: + return None, None + + # Find the parent map element by stepping up the tree + from functools import reduce + + map = reduce(lambda nn, _: None if nn is None else nn.parentNode, + range(5), grid) + if map is None or \ + map.tagName not in [MODULE+'Map',WIDGET+'WidgetMap']: + if map is None: + print(f' = Map not found from grid') + return None, None + + if piece is not None: + print(f' Using supplied piece') + return piece, map + + # Find the piece by searching from the top of the tree + piece = get_pieces(root,root).get(name,None) + if piece is None: + print(list(get_pieces(root,root).keys())) + if verbose: + print(f' Possible piece for region {name}: {piece}') + return piece, map + +# -------------------------------------------------------------------- +def check_region_name(grid,name): + post = '' + targ = name + same = 0 + regs = list(get_regions(grid).keys()) + poss = len([e for e in regs if e.startswith(name)]) + if poss == 0: + return name + + return name + f' {poss}' + # Loop over keys, sorted + # regs.sort() + # for r in regs: + # if targ == r: + # same += 1 + # targ = name + f' {same:02d}' + # print(f' Found region named {r} -> {targ}') + + return targ + +# -------------------------------------------------------------------- +def add_region(root,grid,name,originx,originy,gpid, + alsoPiece=True,piece=None,verbose=True): + # First thing is to check if we have a piece + piece, map = get_region_piece(root,grid,name,alsoPiece,piece,verbose) + if verbose: + print(f' Region {name} -> piece {piece}') + + + nam = check_region_name(grid,name) + if verbose: + print(f' Region {name} -> real name {nam}') + n = add_node(root,grid,PICKER+'board.Region', + name = nam, + originx = originx, + originy = originy) + if piece is None: + return n, gpid + + if verbose: + print(f' Add piece {name} to region') + _, gpid = add_atstart(root,map,name,piece, + location = name, + useGridLocation = True, + owningBoard = map.getAttribute('mapName'), + x = 0, + y = 0, + gpid = gpid) + return n, gpid + + +# -------------------------------------------------------------------- +def add_stacking(root,map, + bottom = '40,0', + disabled = False, + down = '37,0', + exSepX = 6, + exSepY = 18, + top = '38,0', + unexSepX = 8, + unexSepY = 16, + up = '39,0'): + return add_node(root,map,MAP+'StackMetrics', + bottom = bottom, + disabled = disabled, + down = down, + exSepX = exSepX, + exSepY = exSepY, + top = top, + unexSepX = unexSepX, + unexSepY = unexSepY, + up = up) + +# -------------------------------------------------------------------- +def add_camera(root,map, + buttonText = '', + canDisable = False, + hotkey = '', + icon = '/images/camera.gif', + propertyGate = '', + tooltip = 'Save map as PNG image'): + return add_node(root,map,MAP+'ImageSaver', + buttonText = buttonText, + canDisable = canDisable, + hotkey = hotkey, + icon = icon, + propertyGate = propertyGate, + tooltip = tooltip) + +# -------------------------------------------------------------------- +def add_forwardtochatter(root,map): + return add_node(root,map,MAP+'ForwardToChatter') + +# -------------------------------------------------------------------- +def add_menudisplayer(root,map): + return add_node(root,map,MAP+'MenuDisplayer') + +# -------------------------------------------------------------------- +def add_mapcenterer(root,map): + return add_node(root,map,MAP+'MapCenterer') + +# -------------------------------------------------------------------- +def add_stackexpander(root,map): + return add_node(root,map,MAP+'StackExpander') + +# -------------------------------------------------------------------- +def add_piecemover(root,map): + return add_node(root,map,MAP+'PieceMover') + +# -------------------------------------------------------------------- +def add_selectionhighlighters(root,map): + return add_node(root,map,MAP+'SelectionHighlighters') + +# -------------------------------------------------------------------- +def add_keybufferer(root,map): + return add_node(root,map,MAP+'KeyBufferer') + +# -------------------------------------------------------------------- +def add_highlightlastmoved(root,map,color=rgb(255,0,0),enabled=True,thickness=2): + return add_node(root,map,MAP+'HighlightLastMoved', + color=color,enabled=enabled,thickness=thickness) + +# -------------------------------------------------------------------- +def add_counterviewer(root,map, + borderWidth = 0, + centerAll = False, + centerText = False, + combineCounterSummary = False, + counterReportFormat = '', + delay = 700, + description = '', + display = 'from top-most layer only', + emptyHexReportForma = '$LocationName$', + enableHTML = True, + extraTextPadding = 0, + fgColor = rgb(0,0,0), + fontSize = 9, + graphicsZoom = 1.0, + hotkey = key('\n',0), + layerList = '', + minDisplayPieces = 2, + propertyFilter = '', + showDeck = False, + showDeckDepth = 1, + showDeckMasked = False, + showMoveSelectde = False, + showNoStack = False, + showNonMovable = False, + showOverlap = False, + showgraph = True, + showgraphsingle = False, + showtext = False, + showtextsingle = False, + stretchWidthSummary = False, + summaryReportFormat = '$LocationName$', + unrotatePieces = False, + version = 3, + verticalOffset = 0, + verticalTopText = 5, + zoomlevel = 1.0): + return add_node(root,map,MAP+'CounterDetailViewer', + borderWidth = borderWidth, + centerAll = centerAll, + centerText = centerText, + combineCounterSummary = combineCounterSummary, + counterReportFormat = counterReportFormat, + delay = delay, + description = description, + display = display, + emptyHexReportForma = emptyHexReportForma, + enableHTML = enableHTML, + extraTextPadding = extraTextPadding, + fgColor = fgColor, + fontSize = fontSize, + graphicsZoom = graphicsZoom, + hotkey = hotkey, + layerList = layerList, + minDisplayPieces = minDisplayPieces, + propertyFilter = propertyFilter, + showDeck = showDeck, + showDeckDepth = showDeckDepth, + showDeckMasked = showDeckMasked, + showMoveSelectde = showMoveSelectde, + showNoStack = showNoStack, + showNonMovable = showNonMovable, + showOverlap = showOverlap, + showgraph = showgraph, + showgraphsingle = showgraphsingle, + showtext = showtext, + showtextsingle = showtextsingle, + stretchWidthSummary = stretchWidthSummary, + summaryReportFormat = summaryReportFormat, + unrotatePieces = unrotatePieces, + version = version, + verticalOffset = verticalOffset, + verticalTopText = verticalTopText, + zoomlevel = zoomlevel) + +# -------------------------------------------------------------------- +def add_globalmap(root,map, + buttonText = '', + color = rgb(255,0,0), + hotkey = '79,195', + icon = '/images/overview.gif', + scale = 0.2, + tooltip = 'Show/Hide overview window'): + return add_node(root,map,MAP+'GlobalMap', + buttonText = buttonText, + color = color, + hotkey = hotkey, + icon = icon, + scale = scale, + tooltip = 'Show/Hide overview window') + +# -------------------------------------------------------------------- +def add_zoomer(root,map, + inButtonText = '', + inIconName = '/images/zoomIn.gif', + inTooltip = 'Zoom in', + outButtonText = '', + outIconName = '/images/zoomOut.gif', + outTooltip = 'Zoom out', + pickButtonText = '', + pickIconName = '/images/zoom.png', + pickTooltip = 'Select Zoom', + zoomInKey = '61,195', + zoomLevels = [0.2,0.25,0.333,0.4,0.5,0.555,0.625,0.75,1.0,1.25,1.6], + zoomOutKey = key('-'), + zoomPickKey = key('='), + zoomStart = 3): + '''Zoom start is counting from the back (with default zoom levels, + and zoom start, the default zoom is 1''' + lvls = ','.join([str(z) for z in zoomLevels]) + return add_node(root,map,MAP+'Zoomer', + inButtonText = inButtonText, + inIconName = inIconName, + inTooltip = inTooltip, + outButtonText = outButtonText, + outIconName = outIconName, + outTooltip = outTooltip, + pickButtonText = pickButtonText, + pickIconName = pickIconName, + pickTooltip = pickTooltip, + zoomInKey = zoomInKey, + zoomLevels = lvls, + zoomOutKey = zoomOutKey, + zoomPickKey = zoomPickKey, + zoomStart = zoomStart) + +# -------------------------------------------------------------------- +def add_hidepieces(root,map, + buttonText = '', + hiddenIcon = '/images/globe_selected.gif', + hotkey = key('O'), + showingIcon = '/images/globe_unselected.gif', + tooltip = 'Hide all pieces on this map'): + return add_node(root,map,MAP+'HidePiecesButton', + buttonText = buttonText, + hiddenIcon = hiddenIcon, + hotkey = hotkey, + showingIcon = showingIcon, + tooltip = tooltip) +# -------------------------------------------------------------------- +def add_masskey(root,map, + name, + buttonHotkey, + hotkey, + buttonText = '', + canDisable = False, + deckCount = '-1', + filter = '', + propertyGate = '', + reportFormat = '', + reportSingle = False, + singleMap = True, + target = 'MAP|false|MAP|||||0|0||true|Selected|true|EQUALS', + tooltip = '', + icon = ''): + '''Default targets are selected units''' + return add_node(root,map,MAP+'MassKeyCommand', + name = name, + buttonHotkey = buttonHotkey, # This hot key + hotkey = hotkey, # Target hot key + buttonText = buttonText, + canDisable = canDisable, + deckCount = deckCount, + filter = filter, + propertyGate = propertyGate, + reportFormat = reportFormat, + reportSingle = reportSingle, + singleMap = singleMap, + target = target, + tooltip = tooltip, + icon = icon) + + +# -------------------------------------------------------------------- +def add_flare(root,map, + circleColor = rgb(255,0,0), + circleScale = True, + circleSize = 100, + flareKey = 'keyAlt', + flareName = 'Map Flare', + flarePulses = 6, + flarePulsesPerSec = 3, + reportFormat = ''): + return add_node(root,map,MAP+'Flare', + circleColor = circleColor, + circleScale = circleScale, + circleSize = circleSize, + flareKey = flareKey, + flareName = flareName, + flarePulses = flarePulses, + flarePulsesPerSec = flarePulsesPerSec, + reportFormat = '') + +# -------------------------------------------------------------------- +def add_atstart(root,map,name,*pieces, + location = '', + useGridLocation = True, + owningBoard = '', + x = 0, + y = 0, + gpid = None): + '''Pieces are existing PieceSlot elements''' + a = add_node(root,map,MODULE+'map.SetupStack', + name = name, + location = location, + owningBoard = owningBoard, + useGridLocation = useGridLocation, + x = x, + y = y) + # copy pieces here + for p in pieces: + c = p.cloneNode(True) + a.appendChild(c) + if gpid is not None: + # Update gpid in element + c.setAttribute('gpid',str(gpid)) + # Update gpid in traits state + traits = get_piece_parts(p.childNodes[0].nodeValue) + for t in traits: + code = t['def'] + stat = t['state'] + if code[0] == 'piece': + stat[3] = gpid + # Put back the traits + c.childNodes[0].nodeValue = dicts_to_piece(traits) + + gpid += 1 + + return a, gpid + +# -------------------------------------------------------------------- +def add_pieceslot(root,elem, + entryName, + gpid, + code, + height=72, + width=72, + icon = ''): + p = add_node(root,elem,WIDGET+'PieceSlot', + entryName = entryName, + gpid = gpid, + height = height, + width = width, + icon = icon) + add_text(root,p,code) + return p + +# -------------------------------------------------------------------- +def add_prototypes(root,elem,*defs): + '''Defs are existing definition elements''' + p = add_node(root,elem,MODULE+'PrototypesContainer') + + for d in defs: + c = d.cloneNode(True) + p.appendChild(c) + + return p + +# -------------------------------------------------------------------- +def add_prototype(root,elem,name,code,description=''): + d = add_node(root,elem,MODULE+'PrototypeDefinition', + name = name, + description = description) + add_text(root,d,code) + +# -------------------------------------------------------------------- +def add_piecewindow(root,elem,name, + defaultWidth = 0, + hidden = False, + hotkey = key('C',ALT), + scale = 1., + text = '', + tooltip = 'Show/hide piece window', + icon = '/images/counter.gif'): + return add_node(root,elem,MODULE+'PieceWindow', + name = name, + defaultWidth = defaultWidth, + hidden = hidden, + hotkey = hotkey, + scale = scale, + text = text, + tooltip = tooltip, + icon = icon) + +# -------------------------------------------------------------------- +def add_tabs(root,elem,entryName): + return add_node(root,elem,WIDGET+'TabWidget',entryName=entryName) + +# -------------------------------------------------------------------- +def add_list(root,elem, + entryName, + height = 0, + width = 0, + scale = 1., + divider = 100): + return add_node(root,elem,WIDGET+'ListWidget', + entryName = entryName, + height = height, + width = width, + scale = scale, + divider = divider) + +# -------------------------------------------------------------------- +def add_panel(root,elem, + entryName, + fixed = False, + nColumns = 1, + vert = False): + return add_node(root,elem,WIDGET+'PanelWidget', + entryName = entryName, + fixed = fixed, + nColumns = nColumns, + vert = vert) + +# -------------------------------------------------------------------- +def add_mapwidget(root,elem,entryName=''): + return add_node(root,elem,WIDGET+'MapWidget',entryName=entryName) + +# -------------------------------------------------------------------- +def add_chartwindow(root,elem, + name, + hotkey = key('A',ALT), + description = '', + text = '', + tooltip = 'Show/hide Charts', + icon = '/images/chart.gif'): + return add_node(root,elem,MODULE+'ChartWindow', + name = name, + hotkey = hotkey, + description = description, + text = text, + tooltip = tooltip, + icon = icon) + +# -------------------------------------------------------------------- +def add_chart(root,elem, + chartName, + fileName, + description = ''): + return add_node(root,elem,WIDGET+'Chart', + chartName = chartName, + description = description, + fileName = fileName) + +# -------------------------------------------------------------------- +def add_dice(root,elem, + addToTotal = 0, + canDisable = False, + hotkey = key('6',ALT), + icon = '/images/die.gif', + keepCount = 1, + keepDice = False, + keepOption = '>', + lockAdd = False, + lockDice = False, + lockPlus = False, + lockSides = False, + nDice = 1, + nSides = 6, + name = '1d6', + plus = 0, + prompt = False, + propertyGate = '', + reportFormat = '** $name$ = $result$ *** &lt;$PlayerName$&gt;', + reportTotal = False, + sortDice = False, + text = '1d6', + tooltip = 'Roll a 1d6'): + return add_node(root,elem,MODULE+'DiceButton', + addToTotal = addToTotal, + canDisable = canDisable, + hotkey = hotkey, + icon = icon, + keepCount = keepCount, + keepDice = keepDice, + keepOption = keepOption, + lockAdd = lockAdd, + lockDice = lockDice, + lockPlus = lockPlus, + lockSides = lockSides, + nDice = nDice, + nSides = nSides, + name = name, + plus = plus, + prompt = prompt, + propertyGate = propertyGate, + reportFormat = reportFormat, + reportTotal = reportTotal, + sortDice = sortDice, + text = text, + tooltip = tooltip) + +# ==================================================================== +def enc_def(args,term=False): + '''Encode a piece (decorator) definition + + Parameters + ---------- + args : list + List of fields + term : bool + If true, add terminating ';' + + Returns + ------- + code : str + The encoded definition + ''' + return ';'.join([str(e).lower() if isinstance(e,bool) else str(e) + for e in args])+(';' if term else '') + +# -------------------------------------------------------------------- +def layer_trait(images, + newNames = None, + activateName = 'Activate', + activateMask = CTRL, + activateChar = 'A', + increaseName = 'Increase', + increaseMask = CTRL, + increaseChar = '[', + decreaseName = '', + decreaseMask = CTRL, + decreaseChar = ']', + resetName = '', + resetKey = '', + resetLevel = 1, + under = False, + underXoff = 0, + underYoff = 0, + loop = True, + name = '', + description = '', + randomKey = '', + randomName = '', + follow = False, + expression = '', + first = 1, + version = 1, # 1:new, 0:old + always = 'true', + activateKey = key('A'), + increaseKey = key('['), + decreaseKey = key(']'), + scale = 1.): + '''Create a layer trait (VASSAL.counter.Embellishment) + + Parameters + ---------- + main : dict + Main image dictionary + flipped : dict + Flipped image dictionary + + Returns + ------- + code : str + Encoded trait + stat : str + Encoded state + ''' + if newNames is None: + newNames = ['']*len(images) + args = ['emb2', # Code + activateName, activateMask, activateChar, # ACTIVATE ; MASK ; KEY + increaseName, increaseMask, increaseChar, + decreaseName, decreaseMask, decreaseChar, + resetName, resetKey, resetLevel, + under, underXoff, underYoff, + ','.join(images), + ','.join(newNames), + loop, + name, + randomKey, randomName, + follow, expression, + first, + version, + always, + activateKey, + increaseKey, + decreaseKey, + description, + scale ] + stat = '1' # CURRENT LEVEL + return enc_def(args), stat + +# -------------------------------------------------------------------- +def prototype_trait(name): + '''Create a prototype trait (VASSAL.counter.UsePrototype) + + Parameters + ---------- + family : str + Side in game + + Return + ------ + code : str + Encoded trait + stat : str + Encoded state (empty string) + ''' + args = ['prototype', name ] + stat = '' # State is nothing + return enc_def(args), stat + +# -------------------------------------------------------------------- +def mark_trait(key,value): + '''Create a marker trait (VASSAL.counter.Marker) + + Parameters + ---------- + family : str + Side in game + + Return + ------ + code : str + Encoded trait + stat : str + Encoded state (empty string) + ''' + args = ['mark', key ] + stat = value # State is nothing + return enc_def(args), stat + +# -------------------------------------------------------------------- +def report_trait(*keys, + nosuppress = True, + description = '', + report = '$location$: $newPieceName$ $menuCommand$ *', + cyclekeys = '', + cyclereps = ''): + '''Create a report trait (VASSAL.counters.ReportActon) + + Parameters + ---------- + *keys : tuple of str + The keys to report actions for + + Returns + ------- + code : str + Encoded trait + stat : str + Encoded state (empty string) + ''' + esckeys = ','.join([k.replace(',',r'\,') for k in keys]) + esccycl = ','.join([k.replace(',',r'\,') for k in cyclekeys]) + escreps = ','.join([k.replace(',',r'\,') for k in cyclereps]) + args = ['report', # CODE + esckeys, # ESCAPED KEYS (commas escaped) + report, # REPORT + esccycl, # CYCLE KEYS (commas escaped) + escreps, # CYCKE REPORTS (commas escaped) + description, # DESCRIPTION + nosuppress] # NOSUPPRESS + stat = '-1' # CYCLE STATE + return enc_def(args), stat + +# -------------------------------------------------------------------- +def moved_trait(image='moved.gif', + xoff = 36, + yoff = -38, + name = 'Mark Moved', + key = key('M')): + '''Create a moved trait (VASSAL.counters.MovementMarkable) + + Returns + ------- + code : str + Encoded trait + stat : str + Encoded state (empty string) + ''' + args = ['markmoved', # CODE + image, # IMAGE + xoff, yoff, # XOFF ; YOFF + name, # MENU + key, # KEY, MODIFIER + ''] # ? + stat = False # MOVED? + return enc_def(args), stat + +# -------------------------------------------------------------------- +def trail_trait(key = key('T'), + name = 'Movement Trail', + localVisible = False, + globalVisible = False, + radius = 10, + fillColor = rgb(255,255,255), + lineColor = rgb(0,0,0), + activeOpacity = 100, + inactiveOpacity = 50, + edgesBuffer = 20, + displayBuffer = 30, + lineWidth = 1, + turnOn = '', + turnOff = '', + reset = '', + description = ''): + ''' Create a movement trail trait ( VASSAL.counters.Footprint) + + Returns + ------- + code : str + Encoded trait + stat : str + Encoded state + ''' + args = ['footprint', # CODE + key, # ENABLE KEY + name, # MENU + localVisible, # LOCAL VISABLE + globalVisible, # GLOBAL VISABLE + radius, # RADIUS + fillColor, # FILL COLOR + lineColor, # LINE COLOR + activeOpacity, # ACTIVE OPACITY + inactiveOpacity, # INACTIVE OPACITY + edgesBuffer, # EDGES BUFFER + displayBuffer, # DISPLAY BUFFER + lineWidth, # LINE WIDTH + turnOn, # TURN ON KEY + turnOff, # TURN OFF KEY + reset, # RESET KEY + description] # DESC + stat = [False, # GLOBAL VIS + '', # MAP + 0] # POINTS (followed by [; [X,Y]*] + return enc_def(args), enc_def(stat) + +# -------------------------------------------------------------------- +def delete_trait(name = 'Delete', key = key('D')): + '''Create a delete trait (VASSAL.counters.Delete) + + Returns + ------- + code : str + Encoded trait + stat : str + Encoded state (empty string) + ''' + args = ['delete', name, key, ''] + stat = '' # Nothing + return enc_def(args), stat + +# -------------------------------------------------------------------- +def sendto_trait(mapName, + boardName, + name = 'Eliminate', + key = key('E'), + restoreName = 'Restore', + restoreKey = key('R'), + x = 200, + y = 200, + xidx = 0, + yidx = 0, + xoff = 1, + yoff = 1, + description = 'Eliminate this unit', + destination = 'L', + zone = '', + region = '', + expression = '', + position = ''): + '''Create a send to trait (VASSAL.counter.SendToLocation) + + Parameters + ---------- + side : str + Sub-map to move to + + Returns + ------- + code : str + Encoded trait + stat : str + Encoded state (empty string) + ''' + args = ['sendto', # CODE + name, # NAME + key, # KEY , MODIFIER + mapName, # MAP + boardName, # BOARD + x, y, # X ; Y + restoreName, # BACK + restoreKey, # KEY , MODIFIER + xidx, yidx, # XIDX ; YIDX + xoff, yoff, # XOFF ; YOFF + description, # DESC + destination, # DEST + zone, # ZONE + region, # REGION + expression, # EXPRESSION + position ] # GRIDPOS + stat = ['', # BACKMAP + '', # X + ''] # Y + return enc_def(args), enc_def(stat) + +# -------------------------------------------------------------------- +def basic_trait(name, + filename, # Can be empty + gpid, # Can be empty + cloneKey='', # Deprecated + deleteKey=''):# Deprecated + '''Create a basic unit (VASSAL.counters.BasicPiece) + + Parameters + ---------- + main : dict + Information + gpid : int + Piece global identifier + image : bool + If true, add image + + Returns + ------- + code : str + Encoded trait + stat : str + Encoded state (empty string) + ''' + args = ['piece', # CODE + cloneKey, # CLONEKEY + deleteKey, # DELETEKEY + filename, # IMAGE + name] # NAME + stat = ['null', # MAPID (possibly 'null') + 0, # X + 0, # Y + gpid, # GLOBAL PIECE ID + 0] # PROPERTY COUNT (followed by [; KEY; VALUE]+) + return enc_def(args), enc_def(stat) + +# -------------------------------------------------------------------- +def enc_parts(*parts): + '''Encode parts of a full piece definition + + Each trait (VASSAL.counter.Decorator, VASSAL.counter.BasicPiece) + definition or state is separated by a litteral TAB character. + Beyond the first TAB separator, additional escape characters + (BACKSLAH) are added in front of the separator. This is to that + VASSAL.utils.SequenceDecoder does not see consequitive TABs as a + single TAB. + + Parameters + ---------- + parts : tuple + The various trait definitions or states + + Returns + ------- + code : str + The encoded piece + ''' + ret = '' + sep = r' ' + for i, p in enumerate(parts): + if i != 0: + ret += '\\'*(i-1) + sep + ret += str(p) + + return ret + +# -------------------------------------------------------------------- +def add_piece(typ, state): + '''Create and add piece command (VASSAL.command.AddPiece) + + Each part is separated by a SLASH ('/'). The first part is the + command type (PLUS '+') to perform. Second is the IDENTIFIER, + possibly 'null'. Then comes the fully encoded type of the piece, + followed by the state of the piece (also fully encoded). + + Parameters + ---------- + typ : str + Encoded piece definition + state : str + Encoded state definition + + Returns + ------- + cmd : str + The add command encoded + ''' + args = ['+', # Type + 'null', # IDENTIFER + typ, # DEFINITION + state] # STATE + return '/'.join(args) + +# -------------------------------------------------------------------- +def add_proto(typ,state): + '''Create an add prototype command. This is the same as 'add_piece' + + Parameters + ---------- + typ : str + Encoded piece definition + state : str + Encoded state definition + + Returns + ------- + cmd : str + The add command encoded + ''' + return add_piece(typ,state) + + +# ==================================================================== +# +# Below specific to the export app +# +# ==================================================================== +def get_bb(buffer): + '''Get bounding box of image + + Parameters + ---------- + buffer : bytes + The image bytes + + Returns + ------- + ulx, uly, lrx, lry : tuple + The coordinates of the bounding box + ''' + from PIL import Image + from io import BytesIO + + with Image.open(BytesIO(buffer)) as img: + bb = img.getbbox() + + return bb + +# ==================================================================== +def piece_body(family,main,flipped,gpid): + '''Create an full add piece command from the side, image, and ID + information. This adds (in reverse order) + + - BasicPiece + - Side prototype + - Flip layer (if 'flipped' is not none) + + Parameters + ---------- + family : str + Side in the game + main : dict + Main image information + flipped : dict + Flipped image information, possibly None + gpid : int + Global piece identifier + + Returns + ------- + cmd : str + The command to add the piece + ''' + # Create the layer, prototype, and basic piece traits + decs = [] + if flipped is not None: + imgs = [ main['filename'], flipped['filename'] ] + decs.extend([ layer_trait(images=imgs, + newNames=['','Reduced +'], + activateName = '', + decreaseName = '', + increaseName = 'Flip', + increaseKey = key('F'), + decreaseKey = '', + name='Step'), + report_trait(key('F')) ]) + for m in main.get('mains',[]): + decs.append(prototype_trait(m + ' prototype')) + ech = main.get('echelon',None) + cmd = main.get('command',None) + if ech is not None: decs.append(prototype_trait(ech + ' prototype')) + if cmd is not None: decs.append(prototype_trait(cmd + ' prototype')) + + decs.extend([ prototype_trait(family+' prototype'), + basic_trait(main['name'], main['filename'],gpid) + ]) + + typs = [d[0] for d in decs] + stts = [d[1] for d in decs] + typ = enc_parts(*typs) + stt = enc_parts(*stts) + + return add_piece(typ,stt) + +# -------------------------------------------------------------------- +def proto_body(family): + '''Create an full add prototype com from the side information. + This adds (in reverse order) + + - An empty BasicPiece + - An eliminate (or sendto) trait + - A delete trait + - A mark moved trait + - A move trail trait + + Parameters + ---------- + family : str + Side in the game + + Returns + ------- + cmd : str + The command to add the piece + ''' + # Dummy image + decs = [ report_trait(key('E'),key('R'),key('M')), + moved_trait(), + trail_trait(), + delete_trait(), + sendto_trait('DeadMap',family+' pool'), + mark_trait('Faction',family), + basic_trait('','','') ] + typs = [d[0] for d in decs] + stts = [d[1] for d in decs] + typ = enc_parts(*typs) + stt = enc_parts(*stts) + + return add_proto(typ,stt) + +# -------------------------------------------------------------------- +def add_splash(root,doc,categories,title='',verbose=False): + '''Add an about page + + Parametersg + ---------- + root : xml.dom.minidom.Document + Root of the document + doc : xml.dom.minidom.Element + The documentation element + categories : dict + Catalog of images + title : str + Title of the game + ''' + fronts = categories.get('front',{}).get('all',[]) + front = list(fronts.values())[0] if len(fronts) > 0 else None + if front is None: + return + + if verbose: + print(f'Adding about page with {title}') + + add_about(root,doc, f'About {title}', fileName = front['filename']) + +# -------------------------------------------------------------------- +def add_rules(root,doc,zipfile,rules,verbose=False): + '''Add rules to the module + + Parameters + ---------- + root : xml.dom.minidom.Document + Root of the document + doc : xml.dom.minidom.Element + The documentation element + zipfile : zipfile.ZipFile + The module archive + rules : str + File name of rules (PDF) + ''' + if rules is None or rules == '': + return + + if verbose: + print('Adding rules PDF to module') + + zipfile.write(rules,'rules.pdf') + + add_pdffile(root,doc,title='Show rules',pdfFile='rules.pdf') + +# -------------------------------------------------------------------- +def add_notes(root,doc,zipfile,title,version,sides,pdffile,infofile,rules, + verbose=False): + '''Add rules to the module + + Parameters + ---------- + root : xml.dom.minidom.Document + Root of the document + doc : xml.dom.minidom.Element + The documentation element + zipfile : zipfile.ZipFile + The module archive + sides : list + Sides in the game + pdffile : str + The images PDF + infofile : str + The images information + rules : str + File name of rules (PDF) + ''' + factions = "".join([f'<li>{s}</li>' for s in sides]) + notes = f''' + <html> + <body> + <h1>Draft VASSAL module of {title} (Version {version})</h1> + <p> + This is a draft VASSAL module of {title} generated from + </p> + <ul> + <li>images in {pdffile}, and</li> + <li>information in {infofile}</li> + </ul> + <p> + both generated by LaTeX using the <b>wargame</b> [1] package, and + processed by the Python script <code>export.py</code> from that + package. + </p> + <p> + The module is <i>not</i> complete and the developer should edit + the module as needed in the VASSAL module editor. + </p> + <p> + [1] <code>https://gitlab.com/wargames_tex/wargame_tex</code> + </p> + <h2>Content of the module</h2> + <p> + The <code>export.py</code> Python script has identified the + factions of the game to be + </p> + <ul> + '''+factions+f''' + </ul> + <p> + and generated prototype pieces for these (along with possible + non-faction pieces. The script also generated a map ("dead map") + that contains boards for each faction and is meant to store + eliminated units ("<faction> pool"). These pools have a + generic shape and colour, and the developer should take care to + correct these as needed. + </p> + <p> + Boards of the game present in the {pdffile} and {infofile} files + have been generated. Each board has a single zone in it that + encompasses the full board, and a hex grid is added to that + zone. The module developer should adjust the zone and embedded + hex grid according to the actual map, using the VASSAL module + editor. The hex grid (as well as coordinates) is drawn by + default so as to make this obvious to the developer. The hex + sizes should be correct, and mainly the offset needs to be + adjusted. + </p> + <p> + Images marked as OOBs have also been added as maps to the + module. These also have a single zone with a rectangular grid + imposed in it. This grid, and the grid coordinates are drawn by + default, so it is easier to see and to remember to adjust it. The + module developer should adjust this, possibly adding zones, so + that it matches up with the graphics. The developer can add + units to the OOB via 'At-start' stacks in the VASSAL editor. + </p> + <p> + All pieces identified by {infofile} and present in {pdffile} have + been generated. Double sided pieces (identified by images which + also has a suffix-"flipped" image) are created as such. + </p> + <p> + Charts identified by the {infofile} and {pdffile} have been added + to the module. The are added as separate (pop-up) frames, but + the module developer can change this in the VASSAL module editor. + </p> + <p> + If the {infofile} and {pdffile} identified a front page, then that + has been added to module as the splash screen. + </p> + <p> + If a PDF rules file ({rules}) was passed to the Python script, + then that has been included in the module and is accessible from + the "Help" menu. + </p> + <h2>Key-bindings</h2> + <p> + The following key bindings have been defined + </p> + <table> + <tr> + <td>Alt-A</td> + <td>Show the charts panel</td> + </tr> + <tr> + <td>Alt-B</td> + <td>Show the OOBs</td> + </tr> + <tr> + <td>Alt-C</td> + <td>Show the counters panel</td> + </tr> + <tr> + <td>Alt-E</td> + <td>Show the eliminated units</td> + </tr> + <tr> + <td>Alt-6</td> + <td>Roll the die</td> + </tr> + <tr> + <td>Ctrl-O</td> + <td>Hide/show counters</td> + </tr> + <tr> + <td>Ctrl-F</td> + <td>Flip selected counters</td> + </tr> + <tr> + <td>Ctrl-E</td> + <td>Eliminate selected counters</td> + </tr> + <tr> + <td>Ctrl-+</td> + <td>Zoom in</td> + </tr> + <tr> + <td>Ctrl--</td> + <td>Zoom out</td> + </tr> + <tr> + <td>Ctrl-=</td> + <td>Select zoom</td> + </tr> + <tr> + <td>Ctrl-Shift-O</td> + <td>Show overview map</td> + </tr> + </table> + + Counter short cuts (may not work, right click and use context menu) + <table> + <tr> + <td>Ctrl-F</td> + <td>Flip counter</td> + </tr> + <tr> + <td>Ctrl-D</td> + <td>Delete counter</td> + </tr> + <tr> + <td>Ctrl-M</td> + <td>Toggle "moved" marker</td> + </tr> + <tr> + <td>Ctrl-T</td> + <td>Toggle move trail</td> + </tr> + <tr> + <td>Ctrl-E</td> + <td>Eliminate unit</td> + </tr> + <tr> + <td>Ctrl-R</td> + <td>Restore unit (from dead pool)</td> + </tr> + </table> + <h2>After finalising the module</h2> + <p> + After the developer has finalised the module (added more pieces, + fixed board zones a and grids, add in more commands), then this + Help menu entry should be deleted. You may want to keep key + bindings information in some help file. + </p> + </body> + </html> + ''' + if version.lower() == 'draft': + if verbose: + print(f' Adding draft notes {version}') + zipfile.writestr('help/notes.html',notes) + add_helpfile(root,doc,title='Draft Module notes', + fileName='help/notes.html') + + keys = f''' + <html> + <body> + <h1>{title} (Version {version}) Key bindings</h1> + + <table> + <tr> + <th>Key </th> + <th>Where </th> + <th>Effect</th> + </tr> + <tr> + <td>Alt-A</td> + <td>-</td> + <td>Show the charts panel</td> + </tr> + <tr> + <td>Alt-B</td> + <td>-</td> + <td>Show the OOBs</td> + </tr> + <tr> + <td>Alt-C</td> + <td>-</td> + <td>Show the counters panel</td> + </tr> + <tr> + <td>Alt-E</td> + <td>-</td> + <td>Show the eliminated units</td> + </tr> + <tr> + <td>Alt-6</td> + <td>-</td> + <td>Roll the dice</td> + </tr> + <tr> + <td>Ctrl-O</td> + <td>Board</td> + <td>Hide/show counters</td> + </tr> + <tr> + <td>Ctrl-F</td> + <td>Board</td> + <td>Flip selected counters</td> + </tr> + <tr> + <td>Ctrl-E</td> + <td>Board</td> + <td>Eliminate selected counters</td> + </tr> + <tr> + <td>Ctrl-+</td> + <td>Board</td> + <td>Zoom in</td> + </tr> + <tr> + <td>Ctrl--</td> + <td>Board</td> + <td>Zoom out</td> + </tr> + <tr> + <td>Ctrl-=</td> + <td>Board</td> + <td>Select zoom</td> + </tr> + <tr> + <td>Ctrl-Shift-O</td> + <td>Board</td> + <td>Show overview map</td> + </tr> + <tr> + <td>Ctrl-F</td> + <td>Counter</td> + <td>Flip counter</td> + </tr> + <tr> + <td>Ctrl-D</td> + <td>Counter</td> + <td>Delete counter</td> + </tr> + <tr> + <td>Ctrl-M</td> + <td>Counter</td> + <td>Toggle "moved" marker</td> + </tr> + <tr> + <td>Ctrl-T</td> + <td>Counter</td> + <td>Toggle move trail</td> + </tr> + <tr> + <td>Ctrl-E</td> + <td>Counter</td> + <td>Eliminate unit</td> + </tr> + <tr> + <td>Ctrl-R</td> + <td>Counter</td> + <td>Restore unit (from dead pool)</td> + </tr> + </table> + <p> + Counter short cuts (may not work, right click and use context + menu) + </p> + </body> + </html> + ''' + if verbose: + print(f'Add key bindings help file') + zipfile.writestr('help/keys.html',keys) + add_helpfile(root,doc,title='Key bindings', + fileName='help/keys.html') + + return notes + +# -------------------------------------------------------------------- +def add_basics_to_map(root,map,**attr): + '''Add a map to the document + + Parameters + ---------- + root : xml.dom.minidom.Document + Root of the document + parent : xml.dom.minidom.Element + The parent element + button : str + Button text + name : str + Name of the map + stacking : bool + Whether to enable stacking + + Returns + ------- + map : xml.dom.minidom.Element + The map element + bpicker : xml.dom.minidom.Element + The board picker in map + ''' + stacking = add_stacking(root,map) + add_camera (root,map) + add_forwardtochatter (root,map) + add_menudisplayer (root,map) + add_mapcenterer (root,map) + add_stackexpander (root,map) + add_piecemover (root,map) + add_keybufferer (root,map) + add_selectionhighlighters(root,map) # TBD + add_highlightlastmoved (root,map) + + return stacking + +# -------------------------------------------------------------------- +def add_elim(root,game,sides,categories,verbose=False): + '''Add an eliminated map + + Parameters + ---------- + root : xml.dom.minidom.Document + Root of the document + game : xml.dom.minidom.Element + The parent element + sides : list of str + List of sides in the game + ''' + if verbose: + print(' Adding eliminated map and boards') + + if sides is None or len(sides) == 0: + return + + map = add_map(root,game,'DeadMap', + buttonName = '', #'Eliminated units', + icon = '/images/playerAway.gif', + markMoved = 'Never', + launch = True, + allowMultiple = True, + hotkey=key('E',ALT)) + bpicker = add_boardpicker(root,map, + slotHeight = 400, + slotWidth = 400) + add_setup(root,bpicker,'DeadMap',2,[s+' pool' for s in sides]) + add_masskey(root,map,'Restore', + key('R'), + key('R'), + icon = '/images/Undo16.gif', + tooltip = "Restore selected units") + + for i,s in enumerate(sides): + if verbose: + print(f' Adding {s} pool') + + color = [0,0,0,64] + color[i % 3] = 255 + + w = 400 + h = 400 + c = ','.join([str(c) for c in color]) + dimg = categories.get('pool',{}).get('all',{}).get(s,None) + img = '' + + if dimg: + bb = get_bb(dimg['img']) + w = bb[2] - bb[0] + h = bb[3] - bb[1] + c = '' + img = dimg['filename'] + if verbose: + print(f' Using image provided by the user: {img}') + + add_board(root,bpicker,f'{s} pool', + image = img, + color = c, + width = w, + height = h) + + add_basics_to_map(root,map) + +# -------------------------------------------------------------------- +def add_hex_grid(root,parent,color=rgb(255,0,0),visible=True,grid=True): + '''Add a hex grid, either to a zone or to the multizone container''' + + hexes = add_hexgrid(root,parent,color=color,visible=visible, + edgesLegal=True) + if not grid: + return hexes + + add_hexnumbering(root,hexes, + color = color, + hType = 'A', + hOff = -1, + vType = 'N', + vOff = -1, + visible = visible) + + return hexes + +# -------------------------------------------------------------------- +def get_picture_info(picture,name,width,height,verbose): + ''' + Returns + ------- + hex_width, hex_height : float, float + Scale hex width + scx, scy : float, float, float, float + Scale to image and picture (x,y) + rot90 : bool + True if rotated +/-90 degrees + tran : callable + Translation function + ''' + if picture is None: + print(f'WARNING: No Tikz picture information.' + f"Are you sure you used the `[zoned]' option for the " + f"tikzpicture environment of {name}?") + f = lambda x,y: (x,y) + return HEX_WIDTH,HEX_HEIGHT,1,1,False,f + + # Get picture bounding box + pll = picture['lower left'] + pur = picture['upper right'] + # Get picture transformation + pa = picture['xx'] + pb = picture['xy'] + pc = picture['yx'] + pd = picture['yy'] + # Get picture offset (always 0,0?) + pdx = picture['dx'] + pdy = picture['dy'] + # Define picture global transformation + #pr = lambda x,y: (pa * x + pb * y, pc * x + pd * y) + pr = lambda x,y: (pa * x + pc * y, pb * x + pd * y) + # Globally transform (rotate) picture bounding box + pll = pr(*pll) + pur = pr(*pur) + # Calculate widht, height, and scaling factors + pw = pur[0] - pll[0] + ph = pur[1] - pll[1] + scw = width / pw + sch = height / ph + # Extract picture scales and rotation + # Courtesy of + # https://math.stackexchange.com/questions/13150/extracting-rotation-scale-values-from-2d-transformation-matrix + from math import sqrt, atan2, degrees, isclose + psx = sqrt(pa**2 + pb**2) # * (-1 if pa < 0 else 1) + psy = sqrt(pc**2 + pd**2) # * (-1 if pd < 0 else 1) + prt = degrees(atan2(pc,pd)) + if not any([isclose(abs(prt),a) for a in [0,90,180,270]]): + raise RuntimeException('Rotations of Tikz pictures other than ' + '0 or +/-90,+/- 180, or +/-270 not supported. ' + 'found {prt}') + rot90 = isclose(abs(prt),90) + if any([isclose(prt,a) for a in [90,270,180,-180]]): + print(f'WARNING: rotations by {prt} not fully supported') + + hex_width = psx * HEX_WIDTH + hex_height = psy * HEX_HEIGHT + if verbose: + print(f' Picture transformations: {pa},{pb},{pc},{pd}\n' + f' Scale (x,y): {psx},{psy}\n' + f' Rotation (degrees): {prt}') + + # When translating the Tikz coordinates, it is important to note + # that the Tikz y-axis point upwards, while the picture y-axis + # point downwards. This means that the upper right corner is at + # (width,0) and the lower left corner is at (0,height). + def tranx(x,off=-pll[0]): + # print(f'x: {x} + {off} -> {x+off} -> {int(scw*(x+off))}') + return int(scw * (x + off)+.5) + def trany(y,off=-pur[1]): + # print(f'y: {y} + {off} -> {y+off} -> {-int(sch*(y+off))}') + return -int(sch * (y + off)+.5) + tran = lambda x,y : (tranx(x), trany(y)) + + return hex_width, hex_height, scw * psx, sch * psy, rot90, tran + +# -------------------------------------------------------------------- +def get_hexparams(i,llx,ury,hex_width,hex_height,scx,scy,rot90, + labels,coords,targs,nargs): + targs['dx'] = hex_width + targs['dy'] = hex_height + if labels is not None: + labmap = { + 'auto': { + 'hLeading': 1, 'vLeading': 1, 'hType': 'N', 'vType': 'N' }, + 'auto=numbers' : { + 'hLeading': 1, 'vLeading': 1, 'hType': 'N', 'vType': 'N' }, + 'auto=alpha column': { + 'hLeading': 0, 'vLeading': 0, 'hType': 'A', 'vType': 'N', + 'hOff': -1 }, + 'auto=alpha 2 column': {# Not supported + 'hLeading': 1, 'vLeading': 1, 'hType': 'A', 'vType': 'N' }, + 'auto=inv y x plus 1': { + 'hLeading': 1, 'vLeading': 1, 'hType': 'N', 'vType': 'N', + 'hOff': 0, 'vDescend': True }, + 'auto=x and y plus 1': { + 'hLeading': 1, 'vLeading': 1, 'hType': 'N', 'vType': 'N', + 'hOff': 0, 'vOff': 0 } + } + for l in labels.split(','): + nargs.update(labmap.get(l,{})) + + # Field/Direction | Normal | Rotated | + # ----------------|--------|---------| + # hOff | column | column | + # vOff | row | row | + # hDescend | column | row | True, incr to left + # vDescend | row | column | True, incr upward + # First='H' | column | column | + + # In wargame offset=0 means that the first coordinates are 0,0. + # But offset 0,0 in VASSAL means start at 1,1 + horiz = 'column' + vert = 'row' + nargs['vOff'] = nargs.get('vOff',0)-coords[vert] ['offset']-1 + nargs['hOff'] = nargs.get('hOff',0)-coords[horiz]['offset']-1 + + # In VASSAL, vDesend=False means rows increase downward, + # while in wargame, factor=-1 means rows increase downward + horiz = 'row' if rot90 else 'column' + vert = 'column' if rot90 else 'row' + nargs['hDescend'] = coords[horiz]['factor'] != 1 + nargs['vDescend'] = coords[vert] ['factor'] != -1 # flipped y + targs['edgesLegal'] = True + + # Check for inversed columns + inv_col = coords['column']['factor'] == -1 + ell = hex_width if inv_col else 0 + + # Some special stuff in case of 90 degree rotation + if rot90: + targs.update({'sideways': True}) + nargs['hOff'] -= 1 + nargs['hDescend'] = not nargs['hDescend'] + if inv_col: + nargs['hOff'] += 3 + + margin = i.get('board frame',{}).get('margin',0) + mx = scx * margin + my = scy * margin + if inv_col: mx = 0 # Bug in wargame? + + # Grid offset is defined relative to the full image, + # not the zone: + # + # X,Y offset: The horizontal and vertical position of + # the center of the first hex of the grid. + # + # That is, (x,y)=(0,0) is in the top-left corner of the + # image, while in TikZ it is in the bottom left corner. + # This means we shift by the boudning box offsets plus + # some stuff to align with the zone. + # + # In case of inversed columns, we need to add some extra stuff. + x0, y0 = llx-hex_width/3 + ell + mx, ury + my + + # Rotated? + if rot90: + x0, y0 = ury+2*hex_width/3 + ell + mx, llx + my + + # Below should be double-checked. + + if not rot90: + if coords.get('column',{}).get('top short','') == 'isodd' \ + and coords.get('column',{}).get('offset',0) == -1: + y0 -= hex_width/2 + elif coords.get('column',{}).get('top short','') == 'iseven' \ + and coords.get('column',{}).get('offset',-1) == 0: + y0 -= hex_width/2 + + targs.update({'x0': int(x0),'y0': int(y0)}) + +# -------------------------------------------------------------------- +def get_rectparams(i,llx,ury,width,height,rot90,targs,nargs): + targs['dx'] = width + targs['dy'] = height + targs['x0'] = int(llx - width/2) + targs['y0'] = int(ury + height/2) + targs['color'] = rgb(0,255,0) + nargs['color'] = rgb(0,255,0) + nargs['vDescend'] = True + nargs['vOff'] = -3 + nargs.update({'sep':',','vLeading':0,'hLeading':0}) + +# -------------------------------------------------------------------- +def add_zones(root,zoned,name,board,width,height,gpid, + labels=None,coords=None,picinfo=None, + verbose=False,visible=True): + grids = [] + picture = None + if verbose: + print(f' Adding zones to {name} zoned={"zoned" in board}') + + for k, v in board.items(): + if k == 'labels': labels = v + if k == 'coords': coords = v + if k == 'zoned': picture = v + if 'zone' not in k or k == 'zoned': + continue + + gridtype = (add_hexgrid + if 'hex' in k.lower() + else add_squaregrid) + gridnum = (add_hexnumbering + if 'hex' in k.lower() + else add_squarenumbering) + grids.append([k,v,gridtype,gridnum]) + + if len(grids) < 1: return gpid + if verbose: + print(f' Got zones: {[k[0] for k in grids]}') + # Either get picture information from argument, or deduce from the + # found 'zoned' key. + if picinfo is None: + picinfo = get_picture_info(picture,name,width,height,verbose) + + hex_width, hex_height, scx, scy, rot90, tran = picinfo + + + for g in grids: + n, i, typ, num = g + if verbose: + print(f' Adding zone {n}') + if 'scope' in n: + llx,lly = tran(*i['global lower left']) + urx,ury = tran(*i['global upper right']) + path = [[llx,ury],[urx,ury],[urx,lly],[llx,lly]] + nm = n.replace('zone scope ','') + elif 'path' in n: + path = [tran(*ii) for ii in i['path']] + llx = min([px for px,py in path]) + ury = max([py for px,py in path]) + nm = n.replace('zone path ','') + + # Checkf if we have "point" type elements in this object and + # add them to dict. + points = [ v for k,v in i.items() + if (k.startswith('point') and + isinstance(v,dict) and \ + v.get('type','') == 'point')] + + pathstr = ';'.join([f'{s[0]},{s[1]}' for s in path]) + if verbose: + print(f' Zone path ({llx},{ury}): {pathstr}') + zone = add_zone(root,zoned, + name=nm, + locationFormat = ("$name$" + if 'pool' in n.lower() else + "$gridLocation$"), + useParentGrid=False, + path=pathstr) + + # Do not add grids to pools + if 'pool' in n.lower(): + continue + + targs = {'color':rgb(255,0,0),'visible':visible} + nargs = {'color':rgb(255,0,0),'visible':visible} + if 'hex' in n.lower(): + get_hexparams(i,llx,ury,hex_width,hex_height,scx,scy,rot90, + labels,coords,targs,nargs) + else: + width = hex_width / HEX_WIDTH * RECT_WIDTH + height = hex_height / HEX_HEIGHT * RECT_HEIGHT + get_rectparams(i,llx,ury,width,height,rot90,targs,nargs) + + # print(targs,nargs) + if 'turn' in n.lower(): nargs['sep'] = 'T' + if 'oob' in n.lower(): nargs['sep'] = 'O' + + if verbose: + print(f' Adding grid') + + if len(points) <= 0: + grid = typ(root,zone,**targs) + num(root,grid,**nargs) + else: + if verbose: + print(f' Use a region grid') + grid = add_regiongrid(root,zone,snapto=True,visible=visible) + for p in points: + pn = p["name"] + pc = p["coords"] + if verbose: + print(f' Add region {pn} {p}') + + n, gpid = add_region(root,grid,pn,*tran(*pc),gpid, + alsoPiece=True,verbose=verbose) + + + # Once we've dealt with this grid, we should see if we have + # any embedded zones we should deal with. + add_zones(root,zoned,name,i,width,height,gpid, + labels=labels,coords=coords,picinfo=picinfo, + verbose=verbose) + + # Adding a global grid + #targs['color'] = rgb(0,255,0) + #nargs['color'] = rgb(0,255,0) + #grid = typ(root,zoned,**targs) + #num(root,grid,**nargs) + + return gpid + + +# -------------------------------------------------------------------- +def add_inv(root,game,sides,**attr): + '''Add inventory to module''' + filt = '{' + '||'.join([f'Faction=="{s}"' for s in sides])+'}' + grp = 'Faction,Command,Echelon,Type' + inv = add_inventory(root,game, + include = filt, + groupBy = grp, + sortFormat = '$PieceName$', + tooltip = 'Show inventory of all pieces', + zoomOn = True, + **attr) + return inv + + +# -------------------------------------------------------------------- +def add_map_board(root,game,name,board,gpid,verbose=False,visible=False): + '''A add a single board to the module + ''' + + map = add_map(root,game, name) + bpicker = add_boardpicker(root,map) + + add_counterviewer (root,map) + add_hidepieces (root,map) + add_globalmap (root,map) + add_zoomer (root,map) + add_basics_to_map (root,map) + add_masskey (root,map,'Flip', key('F'),key('F'), + icon = '/images/Undo16.gif', + tooltip='Flip selected units') + add_masskey (root,map,'Eliminate',key('E'),key('E'), + icon = '/images/playerAway.gif', + tooltip='Eliminate selected units') + + # Get the image so we may make a rectangle + if verbose: + print(f' Adding board {board["name"]} -> {board["filename"]}') + ulx,uly,lrx,lry = get_bb(board['img']) + eboard = add_board(root,bpicker,name,image=board['filename']) + zoned = add_zoned(root,eboard) + #hexes = add_hexgrid(root,zoned) + add_zonehighlighter(root,zoned) + + if not 'zones' in board: + full = add_zone(root,zoned, + name='full', + useParentGrid=False, + path=(f'{ulx},{uly};' + + f'{lrx},{uly};' + + f'{lrx},{lry};' + + f'{ulx},{lry}')) + + # We do not have board info, so add a grid to the whole thing + add_hex_grid(root,full,rgb(255,0,0),True,True,visible=visible) + return + + # If we get here, we have board info! + w = abs(ulx-lrx) + h = abs(uly-lry) + return add_zones(root,zoned,name,board['zones'],w,h,gpid, + verbose=verbose,visible=visible) + +# -------------------------------------------------------------------- +def add_boards(root,game,categories,sides,gpid,verbose=False,visible=False): + '''Add all boards to the module, including eliminated map + + Parameters + ---------- + root : xml.dom.minidom.Document + Root of the document + game : xml.dom.minidom.Element + The parent element + categories : dict + Catalogue of images + sides : list of str + List of sides in the game + Name of the map + ''' + if verbose: + print('Adding maps and boards') + + # Loop over defined boards + for bn, b in categories.get('board',{}).get('all',{}).items(): + gpid = add_map_board(root,game,bn,b,gpid,verbose,visible) + + add_elim(root,game,sides,categories,verbose) + + return gpid + +# -------------------------------------------------------------------- +def add_oob(root,widget,name,oob,gpid,hotkey='',verbose=False,visible=False): + '''A add a single board to the module + ''' + # Short hand + cr = lambda parent,tag,**attr : create_elem(root,parent,vn(tag),**attr) + + if verbose: + print(f' Adding oob {name}') + + map = add_widgetmap(root,widget, name,markMoved='Never',hotkey='') + bpicker = add_boardpicker(root,map) + + add_counterviewer (root,map) + add_zoomer (root,map) + add_basics_to_map (root,map) + + + # Get the image so we may make a rectangle + if verbose: + print(f' Adding OOB {oob["name"]} -> {oob["filename"]}') + + ulx,uly,lrx,lry = get_bb(oob['img']) + board = add_board(root,bpicker,name,image=oob['filename']) + zoned = add_zoned(root,board) + add_zonehighlighter(root,zoned) + + if not 'zones' in oob: + zone = add_zone(root,zoned, + name='full', + useParentGrid=False, + path=(f'{ulx},{uly};' + + f'{lrx},{uly};' + + f'{lrx},{lry};' + + f'{ulx},{lry}')) + # We do not have board info, so add a grid to the whole thing + grid = add_squaregrid(root,zone,visible=visible) + add_squarenumbering(root,grid,visible=visible) + return + + # If we get here, we have board info! + w = abs(ulx-lrx) + h = abs(uly-lry) + return add_zones(root,zoned,name,oob['zones'],w,h,gpid, + verbose=verbose,visible=visible) + +# -------------------------------------------------------------------- +def add_oobs(root,game,categories,gpid,verbose=False,visible=False): + '''Add all OObs to the module + + Parameters + ---------- + root : xml.dom.minidom.Document + Root of the document + game : xml.dom.minidom.Element + The parent element + categories : dict + Catalogue of images + ''' + # Short hand + oobc = categories.get('oob',{}).get('all',{}).items() + if len(oobc) < 1: + return gpid + + oobs = add_chartwindow(root,game, 'OOBs', + hotkey = key('B',ALT), + description = 'OOBs', + text = '', + icon = '/images/inventory.gif', + tooltip = 'Show/hide OOBs') + tabs = add_tabs(root,oobs,'OOBs') + + if verbose: + print('Adding OOBs') + + # Loop over defined boards + for on, o in oobc: + widget = add_mapwidget(root,tabs, entryName=on) + gpid = add_oob(root,widget,on,o,gpid, + verbose = verbose, + hotkey = key('B',ALT), + visible = visible) + + return gpid + +# -------------------------------------------------------------------- +def add_markproto(root,protos,key,value): + decs = [ mark_trait(key,value.capitalize()), + basic_trait('','','') ] + typs = [d[0] for d in decs] + stts = [d[1] for d in decs] + typ = enc_parts(*typs) + stt = enc_parts(*stts) + body = add_proto(typ,stt) + add_prototype(root,protos,value+' prototype',body) + +# -------------------------------------------------------------------- +def add_counters(root,game,categories, + unittypes,echelons,commands,verbose=False): + '''Add all counters to the module. + + This will add all counters to the module, as well as prototypes + for each sub-category. + + Parameters + ---------- + root : xml.dom.minidom.Document + Root of the document + game : xml.dom.minidom.Element + The game element + categories : dict + Catalogue of images + ''' + # Short hand + # Create prototypes container before adding pieces + protos = add_prototypes(root,game) + for utype in unittypes: add_markproto(root,protos,'Type',utype) + for ech in echelons: add_markproto(root,protos,'Echelon',ech) + for cmd in commands: add_markproto(root,protos,'Command',cmd) + + # Stating global piece ID + gpid = 20 + + # A window to hold the pieces + piecew = add_piecewindow(root,game,'Counters', + hotkey = key('C',ALT)) + # Tab container for each sub-category + piecet = add_tabs(root,piecew,entryName='Counters') + + if verbose: + print('Adding counters and prototypes') + + # Loop over sub-categories + for subn, subc in categories.get('counter',{}).items(): + # Friendly message + if verbose: + print(f' Adding {subn} counters and prototype') + + # Create a panel for this sub-category + piecep = add_panel(root,piecet, + entryName = subn, + fixed = False) + # Add a list to the panel + piecel = add_list(root,piecep, + entryName=f'{subn} counters') + + if verbose: + print(f' Prototype: {subn} prototype') + # Create prototype for this sub-category + proto = add_prototype(root,protos, + name = f'{subn} prototype', + code = proto_body(subn), + description = f'Prototype for {subn} counters') + + # Loop over counters in this sub-category + for cn, c in subc.items(): + # Flipped counters are not added directly + if cn.endswith('flipped'): continue + + if verbose: + print(f' counter: {cn}') + + # Get image bounding box + bb = get_bb(c['img']) + + # Get flipped image, if any + cf = subc.get(cn + ' flipped', None) + + # Create a slot for this piece + sl = add_pieceslot(root,piecel, + entryName = cn, + gpid = gpid, + code = piece_body(subn,c,cf,gpid), + height = bb[3]-bb[1], + width = bb[2]-bb[0]) + + # Store the global piece identifier - do we need this? + c['gpid'] = gpid + + # Increment global piece identifier + gpid += 1 + + # Return next free piece identifier + return gpid + +# -------------------------------------------------------------------- +def add_charts(root,game,categories,verbose=False): + '''Add all boards to the module + + This will select all 'chart' elements from the catalogue and add + them as individual (popup) panels to the module. + + Parameters + ---------- + root : xml.dom.minidom.Document + Root of the document + game : xml.dom.minidom.Element + The game element + categories : dict + Catalogue of images + + ''' + chartc = categories.get('chart',{}).get('all',{}).items() + if len(chartc) < 1: + return + + # Short hand + cr = lambda parent,tag,**attr : create_elem(root,parent,vn(tag),**attr) + cw = lambda parent,tag,**attr : create_elem(root,parent,vw(tag),**attr) + + if verbose: + print('Adding charts') + + charts = add_chartwindow(root,game, 'Charts', + hotkey = key('A',ALT), + description = 'Charts', + tooltip = 'Show/hide Charts') + tabs = add_tabs(root,charts,'Charts') + + + # Loop over defined charts + for cn, c in chartc: + if verbose: + print(f' Chart {cn} ({c["filename"]})') + add_chart(root,tabs, + chartName = cn, + description = cn, + fileName = c['filename']) + +# -------------------------------------------------------------------- +def add_diceroll(root,game,categories,verbose=False): + '''Add a dice button (1d6) + + Parameters + ---------- + root : xml.dom.minidom.Document + Root of the document + game : xml.dom.minidom.Element + The game element + categories : dict + Catalogue of images + ''' + if verbose: + print('Adding dice') + + add_dice(root,game, + hotkey = key('6',ALT), + nDice = 1, + nSides = 6, + text = '1d6', + tooltip = 'Roll a 1d6', + name = '1d6') + + +# ==================================================================== +def create_build(info, + categories, + unittypes, + echelons, + commands, + zipfile, + title, + version, + desc = '', + rules = None, + pdffile = '', + infofile = '', + verbose = False, + visible = False): + '''Create the buildFile.xml document + + Parameters + ---------- + info : dict + Information dicationary + categories : dict + Catalogue of images + unittypes : set + Set of used unit types + zipfile : zipfile.ZipFile + Module archive + title : str + Title of module + version : str + Version number of module + desc : str + Short description of the game + rules : str + Filename of PDF rules document (if any) + + Returns + ------- + xml : str + The encoded document + ''' + from xml.dom.minidom import Document + + if verbose: + print(f'Creating buildFile.xml: {title},{version}') + + # Create document + root = Document() + + # Add game element + game = add_game(root,root, + name = title, + version = version, + description = desc) + + # Extract the sides of the game from the counter sub-categories + # Should be a little more clever about the case here + dsides = {k.lower() : k for k in categories.get('counter',{}).keys()} + sides = None + for skip in ['all','common', 'marker', 'markers']: + if skip in dsides: del dsides[skip] + sides = list(dsides.values()) + if verbose: + print('Identified factions: ',sides) + + # Use the standard command encoder + add_basiccommandencoder(root,game) + + # Add document parts + doc = add_documentation(root,game) + add_splash(root, doc, categories, title,verbose) + add_rules(root, doc, zipfile, rules,verbose) + notes = add_notes(root,doc,zipfile,title,version, + sides,pdffile,infofile,rules,verbose) + + + # Create roster or player sides + roster = add_roster(root,game) + for s in sides: + add_entry(root,roster,s) + + # Add global options - mainly defer to user settings + add_globaloptions(root,game, + autoReport = 'Use Preferences Setting', + centerOnMove = 'Use Preferences Setting', + nonOwnerUnmaskable = 'Use Preferences Setting', + playerIdFormat = '$playerName$') + # Add all pieces to the module (including prototypes) + gpid = add_counters(root,game,categories, + unittypes,echelons,commands,verbose) + # Add an inventory + add_inv(root,game,sides) + # Add all boards to the module (including eliminated map) + gpid = add_boards(root,game,categories,sides,gpid, + verbose=verbose,visible=visible) + # Add all OOBs to the module + gpid = add_oobs(root,game,categories,gpid, + verbose=verbose,visible=visible) + # Add charts to the module + add_charts(root,game,categories,verbose=verbose) + # Add a dice rool + add_diceroll(root,game,categories,verbose=verbose) + + # Set next available piece identifier on the game + game.setAttribute('nextPieceSlotId',str(gpid+1)) + + # Return the document + return root, notes + +# -------------------------------------------------------------------- +def create_data(title,version,desc='',verbose=False): + '''Create the module data XML + + Parameters + ---------- + title : str + Title of the game + version : str + Version number of the module + desc : str + Short description + + Returns + ------- + xml : str + The encoded document + ''' + from xml.dom.minidom import Document + from time import time + + if verbose: + print('Create module data') + + # The document + root = Document() + + # Top of the document + data = root.createElement('data') + data.setAttribute("version","1") + root.appendChild(data) + + # Version number of module + vers = root.createElement('version') + vers.appendChild(root.createTextNode(str(version))) + data.appendChild(vers) + + # Name of the game + name = root.createElement('name') + name.appendChild(root.createTextNode(title)) + data.appendChild(name) + + # VASSAL version (should get this in some other way) + vvers = root.createElement('VassalVersion') + vvers.appendChild(root.createTextNode("3.6.7")) + data.appendChild(vvers) + + # Description, if any + desc = root.createElement('description') + data.appendChild(desc) + + # Automatically set the save data + save = root.createElement('dateSaved') + save.appendChild(root.createTextNode(f'{int(time())}')) + data.appendChild(save) + + return root + + +# ==================================================================== +def create_vmod(vmodname, + info, + title, + version, + desc = '', + rules = None, + pdfname = '', + infoname = '', + patch = None, + verbose = False, + visible = False): + '''Create a VASSAL module from the information passed + + Parameters + ---------- + vmodname : str + Name of the module + info : list + List of images and image data + title : str + Name of the game + version : str + Version of the module + desc : str + Short description of the game + rules : str + Rules PDF (optional) + + Returns + ------- + ''' + from zipfile import ZipFile, ZIP_DEFLATED + from pprint import pprint + + categories = {} + unittypes = [] + echelons = [] + commands = [] + with ZipFile(vmodname,'w',compression=ZIP_DEFLATED) as vmod: + # Create images in ZIP file + for i in info: + if ignore_entry(i): continue + + # Store the name of the image file in catalogue + i['filename'] = i['name'].replace(' ','_') + '.png' + vmod.writestr('images/'+i['filename'],i['img']) + + # Categorize - assume counter + typ = i.get('category','counter') + sub = i.get('subcategory','all') + if sub == '': + i['subcategory'] = 'all' + sub = 'all' + + # Add to catalogue + if typ not in categories: + categories[typ] = {} + cat = categories[typ] + + if sub not in cat: + cat[sub] = {} + tgt = cat[sub] + + tgt[i['name']] = i + + natoapp6c = i.get('natoapp6c',None) + if natoapp6c is not None: + from re import sub + mains = natoapp6c.get('main',None) + echelon = natoapp6c.get('echelon',None) + command = natoapp6c.get('command',None) + + if mains is not None: + mains = sub(r'\[[^]]+\]','',mains)\ + .replace('{','').replace('}','').split(',') + unittypes.extend(mains) + i['mains'] = mains + + if echelon is not None: + echelons.append(natoapp6c['echelon']) + i['echelon'] = echelon + + if command is not None: + commands.append(command) + i['command'] = command + + # Friendly message + # if verbose: + # print(f'{i["name"]} -> {i["type"]}/{i["sub type"]} {typ}/{sub}') + + unittypes = set(unittypes) + echelons = set(echelons) + commands = set(commands) + + # Now create the `buildFile.xml` file + build, notes = create_build(info, + categories, + unittypes, + echelons, + commands, + vmod, + title, + version, + desc, + rules, + pdfname, + infoname, + verbose, + visible) + # Now create the `moduledata` file + data = create_data(title, version, desc,verbose) + + + if patch: + from importlib.util import spec_from_file_location, \ + module_from_spec + from pathlib import Path + from sys import modules + + p = Path(patch) + if verbose: + pn = str(p.stem) + print(f'Will patch module with {pn}.patch function') + + spec = spec_from_file_location(p.stem, p.absolute()) + module = module_from_spec(spec) + spec.loader.exec_module(module) + modules[p.stem] = module + + + # Patch must accept xml.dom.document,xml.dom.document,ZipFile + module.patch(build,data,vmod,verbose) + + buildstr = build.toprettyxml(indent=' ', + encoding="UTF-8", + standalone=False) + datastr = data.toprettyxml(indent=' ', + encoding="UTF-8", + standalone=False) + + vmod.writestr('buildFile.xml',buildstr) + vmod.writestr('moduledata',datastr) + + return notes + +# ==================================================================== +def export(vmodname = 'Draft.vmod', + pdfname = 'export.pdf', + infoname = 'export.json', + title = 'Test', + version = 'Draft', + desc = '', + rules = None, + patch = None, + verbose = False, + visible = False): + '''Do the whole thing + + - Read in information form the 'infoname' file (a CSV file + generated by LaTeX) + + - Convert each page in the 'pdfname' file (a PDF generated by + LaTex) into images + + - Create the VASSAL module + + ''' + if verbose: + print(f'Module name : {vmodname}\n' + f'PDF name : {pdfname}\n' + f'Info name : {infoname}\n' + f'Title : {title}\n' + f'Version : {version}\n' + f'Description : {desc}\n' + f'Rules : {rules}\n') + info = convert_pages(pdfname=pdfname,infoname=infoname) + return create_vmod(vmodname = vmodname, + info = info, + title = title, + version = version, + desc = desc, + rules = rules, + pdfname = pdfname, + infoname = infoname, + patch = patch, + verbose = verbose, + visible = visible) + +# ==================================================================== +if __name__ == '__main__': + from argparse import ArgumentParser, FileType + + ap = ArgumentParser(description='Create draft VASSAL module') + ap.add_argument('pdffile', + help='The PDF file to read images from', + type=FileType('r'), + default='export.pdf', + nargs='?') + ap.add_argument('infofile', + help='The JSON file to read image information from', + type=FileType('r'), + default='export.json', + nargs='?') + ap.add_argument('-p','--patch', + help='A python script to patch generated module', + type=FileType('r')) + ap.add_argument('-o','--output', + help='Output file to write module to', + type=FileType('w'), + default='Draft.vmod') + ap.add_argument('-t','--title', + help='Module title', default='Draft', + type=str) + ap.add_argument('-v','--version', + help='Module version', + type=str, + default='draft') + ap.add_argument('-r','--rules', + help='Rules PDF file', + type=FileType('r')) + ap.add_argument('-d','--description', + help='Short description of module', + type=str, + default='draft of module') + ap.add_argument('-V','--verbose', + help='Be verbose', + action='store_true') + ap.add_argument('-G','--visible-grids', + action='store_true', + help='Make grids visible in the module') + ap.add_argument('-n','--notes', + help='Show notes', + action='store_true') + + + args = ap.parse_args() + + vmodname = args.output.name + rulesname = args.rules.name if args.rules is not None else None + args.output.close() + + patchname = args.patch.name if args.patch is not None else None + if args.patch is not None: + args.patch.close() + + if args.version.lower() == 'draft': + args.visible_grids = True + + try: + notes = export(vmodname = vmodname, + pdfname = args.pdffile.name, + infoname = args.infofile.name, + title = args.title, + version = args.version, + desc = args.description, + rules = rulesname, + patch = patchname, + verbose = args.verbose, + visible = args.visible_grids) + + if args.notes: + print(f'Module {vmodname} created. ' + 'Here are the notes from the module') + print(notes) + + except Exception as e: + from sys import stderr + print(f'Failed to build {vmodname}: e',file=stderr) + from os import unlink + try: + unlink(vmodname) + except: + pass + + raise e diff --git a/macros/latex/contrib/wargame/source/utils/svg2tikz.py b/macros/latex/contrib/wargame/source/utils/svg2tikz.py new file mode 100755 index 0000000000..a9f3c60203 --- /dev/null +++ b/macros/latex/contrib/wargame/source/utils/svg2tikz.py @@ -0,0 +1,365 @@ +#!/usr/bin/env python3 + +from sys import stderr, stdout + +def monkey_patch(): + from svgelements import SVGElement + + def SVGElement__imatmul__(self,other): + print('Dummy SVGElement.__imatmul__') + return self + + SVGElement.__imatmul__ = SVGElement__imatmul__ + +monkey_patch() + +# -------------------------------------------------------------------- +def open_svg(input): + from svgelements import SVG + + svg = SVG.parse(input,reify=False) + print(type(svg[0]),file=stderr) + return svg + +# -------------------------------------------------------------------- +def get_bb(svg): + llx,lly,urx,ury = svg.bbox() + # print(llx,lly,urx,ury) + return llx,lly,urx,ury + +# -------------------------------------------------------------------- +def flush_left(svg): + from svgelements import Matrix + + llx,lly,urx,ury = get_bb(svg) + svg *= Matrix.translate(-llx,-lly) + return svg + +# -------------------------------------------------------------------- +def scale_unit(svg): + from svgelements import Matrix + + llx,lly,urx,ury = get_bb(svg) + scale = 1 / max(urx,ury) + svg *= Matrix.scale(scale) + + return svg + +# -------------------------------------------------------------------- +def scale_to_cm(svg,px_per_cm = 37.79531157367762334497): + from svgelements import Matrix + + scale = 1 / px_per_cm + svg *= Matrix.scale(scale) + + return svg + +# -------------------------------------------------------------------- +def shift_to_centre(svg): + from svgelements import Matrix + + llx,lly,urx,ury = get_bb(svg) + svg *= Matrix.translate(-urx/2,-ury/2) + svg *= Matrix.scale(1,-1) + svg.reify() + svg.render() + return svg + +# -------------------------------------------------------------------- +def flipy(svg): + from svgelements import Matrix + + llx,lly,urx,ury = get_bb(svg) + svg *= Matrix.translate(-llx,-lly) + svg *= Matrix.scale(1,-1) + svg.reify() + svg.render() + llx,lly,urx,ury = get_bb(svg) + svg *= Matrix.translate(0,-lly) + return svg + +# ==================================================================== +def get_paths(svg): + '''Read in paths from the SVG image + + This will recurse down groups for path operations + + Returns + ------- + paths : list + List of svg.path.Path objects + ''' + from svgelements import Path, Group + from svg.path import parse_path + + paths = [] + + for e in svg: + if isinstance(e,Path): + print('Parse path',file=stderr) + p = parse_path(e.d()) + paths.append(p) + if isinstance(e,Group): + print('Parse group',file=stderr) + paths.append(get_paths(e)) + + return paths + +# ==================================================================== +def tikz_point(e,f): + '''Ouput a point + + Parameters + ---------- + e : complex + The point + f : str + Floating point format + + Return + ------ + coord : str + The point formatted for Tikz + ''' + return f'({e.real:{f}},{e.imag:{f}})' + +# -------------------------------------------------------------------- +def tikz_move(e,f): + '''Output a move-to operation + + Parameters + ---------- + e : complex + The point to move to + f : str + Floating point format + + Return + ------ + coord : str + The point formatted for Tikz + ''' + return tikz_point(e.start,f) + +# -------------------------------------------------------------------- +def tikz_line(e,f): + '''Output a line-to operation + + Parameters + ---------- + e : complex + The point to draw line to + f : str + Floating point format + + Return + ------ + line : str + The line-to operation to point + ''' + return '-- '+tikz_point(e.end,f) + +# -------------------------------------------------------------------- +def tikz_curve(e,f): + '''Output a curve-to operation + + Parameters + ---------- + e : curve operation (3 complex numbers) + The control points (2 of them) and the point to draw curve to + f : str + Floating point format + + Return + ------ + curve : str + The curve-to operation to point + ''' + return \ + '.. controls '+tikz_point(e.control1,f) + \ + ' and ' +tikz_point(e.control2,f) + \ + ' ..' +tikz_point(e.end,f) + +# -------------------------------------------------------------------- +def tikz_close(e,f): + '''Ouput a close (or cycle) operation + ''' + return '-- cycle' + +# ==================================================================== +def path_to_tikz(path,f='8.5f'): + '''Convert a svt.path.Path to a TikZ path + + Parameters + ---------- + path : svg.path.Path + Path to convert + f : str + floating point format to use + + Returns + ------- + code : list + List of Tikz path operations as strings + ''' + from svg.path import Line, Move, Close, CubicBezier, Path + + code = [] + for e in path: + if isinstance(e, Move): code.append(tikz_move(e, f)) + elif isinstance(e, Line): code.append(tikz_line(e, f)) + elif isinstance(e, Close): code.append(tikz_close(e,f)) + elif isinstance(e, CubicBezier): code.append(tikz_curve(e,f)) + elif isinstance(e, Path): code.extend(path_to_tikz(e,f)) + else: + print(f'Unknown type: {type(e)}',file=stderr) + + return code + +# ==================================================================== +def doc_header(output=stdout): + '''Prinout put standalone document header + ''' + print(r'''% +\documentclass{standalone} +\usepackage{tikz} +\begin{document}%''',file=output) + +# -------------------------------------------------------------------- +def doc_footer(output=stdout): + '''Prinout put standalone document footer + ''' + print(r'''% +\end{document}''',file=output) + +# -------------------------------------------------------------------- +def path_to_pic(path,name,output,format): + '''Output a Tikz pic definition from the path + + Parameters + ---------- + path : Path + The path to convert + name : str + The name of the pic + output : File + Output file + format : str + Floating point format + ''' + print(fr'''\tikzset{{% + {name}/.pic={{% + \path[pic actions]''',file=output,end='\n ') + + code = path_to_tikz(path,format) + print('\n '.join(code),file=output) + print(' ;\n }',file=output) + print('}%',file=output) + +# ==================================================================== + +# ==================================================================== +def doit(input='soldier_side.svg', + centre=True, + unit=True, + output=stdout, + standalone=False, + format='8.5f'): + svg = open_svg(input) + orig_bb = get_bb(svg) + + if centre or unit: + svg = flush_left(svg) + if unit: + svg = scale_unit(svg) + else: + svg = scale_to_cm(svg) + if centre: + svg = shift_to_centre(svg) + else: + svg = flipy(svg) + new_bb = get_bb(svg) + + paths = get_paths(svg) + + if standalone: + doc_header(output) + print(f'% Original bounding box: ({orig_bb[0]},{orig_bb[1]}) ({orig_bb[2]},{orig_bb[3]})', + file=output) + print(f'% New bounding box: ({new_bb[0]},{new_bb[1]}) ({new_bb[2]},{new_bb[3]})', + file=output) + pics = [] + for i, path in enumerate(paths): + name = f'pic_{i:03d}' + path_to_pic(path,name,output,format) + pics.append(name) + + if standalone: + print(r'\begin{tikzpicture}%',file=output) + x = 0 + y = 0 + for i, name in enumerate(pics): + if x > 10: + x = 0 + y += 2 + + print(fr' \pic[draw,fill=red] at ({x},{y}) {{{name}}};%', + file=output) + x += 2 + + print(r'\end{tikzpicture}%',file=output) + doc_footer(output) + +# ==================================================================== +def test(svgfile='soldier_side.svg',tikzfile=stdout,standalone=True): + with open(svgfile,'r') as input: + with open(tikzfile,'w') if isinstance(tikzfile,str) else tikzfile as output: + doit(input=input,output=output,standalone=standalone) + + +# ==================================================================== +if __name__ == '__main__': + from argparse import ArgumentParser, FileType + + ap = ArgumentParser(description='Convert SVG to unit Tikz picture') + ap.add_argument('input',type=FileType('r'),nargs='?',default='soldier_side.svg', + help='Input SVG file') + ap.add_argument('-o','--output',type=FileType('w'),default=None, + help='Output Tikz file') + ap.add_argument('-s','--standalone',action='store_true',default=True, + help='Write standalone document') + ap.add_argument('-p','--picture',action='store_false',dest='standalone', + help='Only write picture') + ap.add_argument('-f','--format',type=str,default='8.5f', + help='Format for coordinates') + ap.add_argument('-O','--original-size',dest='unit',action='store_false', + help='Do no scale paths to unit size') + ap.add_argument('-S','--unit-size',dest='unit',action='store_true', + help='Scale paths to unit size') + ap.add_argument('-Z','--no-centre',dest='centre',action='store_false', + help='Do not centre paths') + ap.add_argument('-C','--centre',dest='centre',action='store_true', + help='Centre paths') + + args = ap.parse_args() + + if args.output is None: + from pathlib import Path + inname = Path(args.input.name) + outname = inname.with_suffix('.tex') + args.output = open(outname,'w') + + + doit(input = args.input, + unit = args.unit, + centre = args.centre, + output = args.output, + standalone = args.standalone, + format = args.format) + + + + + + + diff --git a/macros/latex/contrib/wargame/source/wargame.dtx b/macros/latex/contrib/wargame/source/wargame.dtx new file mode 100644 index 0000000000..a2e7d06a94 --- /dev/null +++ b/macros/latex/contrib/wargame/source/wargame.dtx @@ -0,0 +1,2455 @@ +% \iffalse +%<*driver> +% This is the preamp used in various documents +\documentclass{ltxdoc} +%<symbols>\usepackage[noterrainpic]{wgdoc} +%<!symbols>\usepackage{wgdoc} +%</driver> +%\fi +%\iffalse +%<*doc> +% This is for the main documentation +\usepackage{wgdoc} +\input{testmap} +\input{testchits} +\usetikzlibrary{external} +\tikzexternalize[prefix=cache/] +\CodelineIndex +\EnableCrossrefs +\DisableCrossrefs +\DoNotIndex{\a,\advance,\args,\bfseries,\breakforeach,\cc,\ccc, + \divide,\def,\h,\filldraw,\node,\path,\RequirePackage,\ProvidesPackage, + \Large,\large,\huge,\Huge,\normalsize,\tiny, + \long,\n,\mc,\o,\p, + \usetikzlibrary,\draw,\foreach,\fv,\tikzinputsegmentfirst, + \tikzinputsegmentsupporta,\tikzinputsegmentsupportb, + \tikzinputsegmentlast,\pgfmathparse,\pgfpoint,\edef,\pgfmathresult, + \relax,\ifx,\else,\fi,\definecolor,\tikz,\tikzset,\tikzstyle, + \maxdimen,\pgfseteorule,\message,\global,\clip,\let,\end,\begin, + \sffamily,\selectfont,\fontsize,\DeclareTextFontCommand, + \selectfont,\define@key,\pgf@x,\pgf@y,\xdef,\expandafter,\@ifundefined, + \pgfpointxy,\csname,\endcsname,\pgfpointadd,\fill,\@empty,\@ifnextchar, + \@undefined,\@undefinedb,\arrow,\b,\c,\color,\fontfamily,\fontseries, + \gdef,\i,\k,\m,\newcommand,\newcount,\newif,\newlength + \pgf@pathmaxx,\pgf@pathminx,\pgf@pathmaxy,\pgf@pathminy, + \pgf@picmaxx,\pgf@picminx,\pgf@picmaxy,\pgf@picminy, + \pgf@relevantforpicturesizefalse,\pgf@relevantforpicturesizetrue, + \pic,\r,\setkeys,\setlength,\show,\t,\temp,\the, + \tikzdeclarecoordinatesystem,\tmp@x,\tmp@y,\v,\x,\y} +%% \OnlyDescription +\def\PrintMacroName#1{} +\def\PrintEnvName#1{} +\title{The \textsf{wargame} package} +\author{Christian Holm Christensen} +\date{\today} +\begin{document} +\maketitle +\begin{abstract} + This package provides tools to typesetting manuals, board, and + counters for wargames using \LaTeX{}. + + Licensed under + \href{http://creativecommons.org/licenses/by-sa/4.0}{Creative + Commons Attribution-ShareAlike International License, version 4} + \tikz[scale=.2,transform shape]{\pic{cc by sa};}. +\end{abstract} +\tableofcontents +\wargamedbglvl=0 +\hexdbglvl=0 +\chitdbglvl=0 +\natoappdbglvl=0 +% To avoid: Package multicol Error: Error saving partial page. +\setlength{\IndexMin}{100pt} +\DocInput{wargame.dtx} +\end{document} +%</doc> +%\fi +% +% \iffalse +% ==================================================================== +% +% Documentation +% +% ==================================================================== +% \fi +% +% \newif\ifShowSymbols\ShowSymbolsfalse +% \newif\ifShowCompat\ShowCompatfalse +% +% \iffalse +% -------------------------------------------------------------------- +% +% Introduction +% +% -------------------------------------------------------------------- +% \fi +% +% \section{Introduction} +% +% This package provides tools for typesetting classic, hex-based +% wargames. The package allows an author to design a board, or map, +% comprised of hex, using a relatively simple interface. Units are +% typeset using a similar interface. Unit types are identified using +% the NATO Joint Military Symbology \cite{app6c} standard. +% +% \iffalse +% -------------------------------------------------------------------- +% +% Hexes +% +% -------------------------------------------------------------------- +% \fi +% +% \section{Hex Boards} +% +% The package provides a number of facilities to set-up a board +% comprised of hexagon fields (``hexes''). +% +% \subsection{Placing hexes} +% +% A hex can be added to the current \texttt{tikzpicture} using the +% macro \cs{hex}. It takes up to 4 arguments +% +% \begin{MacroSyntax}{\hex} +% \cs{hex}\oarg{key-value-pairs}\parg{location}\parg{name} +% \end{MacroSyntax} +% +% The \meta{key-value-pairs} specify the hex. Valid options are +% \begin{description} +% \item[\keyval{terrain}{\meta{terrain-keys}}] specifies the terrain +% of the hex. More on in this in +% \sectionname~\ref{sec:hex:terrain}. +% \item[\keyval{ridges}{\meta{ridges-keys}}] specifies where ridges +% are drawn in the hex. \sectionname~\ref{sec:hex:ridges}. +% \item[\keyval{label}{\meta{label-keys}}] specifies the how to output +% the hex label, if any. This is expanded upon in +% \sectionname~\ref{sec:hex:label}. +% \item[\keyval{town}{\meta{town-keys}}] specifies that a town (or +% similar) is present in the hex. The various keys are described in +% \sectionname~\ref{sec:hex:town}. +% \item[\keyval{extra}{\meta{extra-keyx}} \textrm{and} \keyval{extra +% clipped}{\meta{extra-keyx}}] allows the user to put custom +% graphics in the hexes. See also \sectionname~\ref{sec:hex:extra} +% for more. +% \item any style key defined for \TikZ{} pictures. +% \end{description} +% +% The \meta{location} argument specifies the coordinates, in the hex +% coordinate system where to put the hex. More about the coordinate +% system is given in \sectionname~\ref{sec:hex:cs}. Note, the numbers +% starts from the lower--left corner. +% +% The elements are rendered in the following order +% \begin{enumerate} +% \item The terrain, clipped to the hex shape. +% \item The hex, including circumference and fill +% \item The ridges, if any +% \item The label, if any +% \item Extra graphics clipped to the hex +% \item Town, if any +% \item Extra graphics which may extend beyond the confines of the +% hex. +% \end{enumerate} +% +% \figurename~\ref{fig:hex:parts} illustrates some of the components +% of a hex. The hexes are 2 unit lengths wide. Typically, the unit +% length is one centimetre, which means the hexes are roughly +% $2\,\text{cm}\times 1.86\,\text{cmm}$ --- or roughly $3/4"\times +% 3/4"$ --- big. This allows the hexes to fit chits (see +% Section~\ref{sec:chit}) of size $12\,\mathrm{mm}\times12\,\mathrm{mm}$ +% --- or roughly $1/2"\times1/2"$ --- nicely. If one wants larger +% chits or hexes one should take care to scale both by a similar +% amount. +% +% {\makeatletter\global\let\hexyy\hex@yy} +% \tikzset{wg arrow/.style={red!50!black,thick,<-}} +% \begin{figure}[htbp] +% \centering +% \begin{tikzpicture}[scale=2] +% \hex[terrain={woods},label={text=A1},color=blue](r=0,c=0) +% \draw[red]($(hex cs:e=N)-(0,.2)$) +% ellipse [x radius=.8, y radius=.4] node(label){}; +% \draw[wg arrow] (label)--(1.3,1.2) +% node[align=right,anchor=south]{\texttt{label=\{text=A1\}}}; +% \draw[wg arrow] (0,0)--(-2,-1)node[align=right,anchor=base east]{ +% \texttt{terrain=\{woods\}}}; +% \pic[draw,transform shape]{wg/x axis={-1,1, -1.2,{0},}}; +% \pic[draw,transform shape]{wg/y axis={1.2, -1,1, {0},{-\hexyy,\hexyy}}}; +% \end{tikzpicture} +% \caption{Hex parts. The bar on the bottom and to the right +% indicate two units of length.} +% \label{fig:hex:parts} +% \end{figure} +% +% \subsection{Styling hexes} +% +% Typical \TikZ{} options can be passed to the \cs{hex} macro. For +% example, if you want to draw the hex borders in red, simply pass +% \spec{draw=red} in the \oarg{optional} arguments to +% \cs{hex}. Individual parts of the hexes can be styled separately. +% the default style used by \cs{hex} is \spec{tikz/hex/hex}. Users +% can redefine this style to suit their needs. If one does not want +% to change the default style, or pass the same argument to all +% \cs{hex}s one can define the style \spec{tikz/every hex}. For example, +% if one wants to auto label all hexes, one can do +% +% \begin{verbatim} +% \begin{tikzpicture} +% \begin{scope}[every hex/.style={label=auto}] +% % Hexes +% \end{scope} +% \end{tikzpicture} +% \end{verbatim} +% +% \subsection{Hex coordinate system} +% \label{sec:hex:cs} +% +% The package defines a coordinate system based on hexes. The centre +% of a hex is specified as \meta{column}-\meta{row} pairs, while +% vertexes and mid-point on edges can be specified separately. The +% syntax of the coordinates is +% +% \begin{Syntax} +% (hex cs:row=\meta{hex-row},column=\meta{hex-column},vertex=\meta{vertex},edge=\meta{edge}) +% \end{Syntax} +% +% where \meta{vertex} and \meta{edge} are optional. The hex row and +% column defaults both to 0 and can be decimal numbers. The +% \spec{row}, \spec{column}, \spec{vertex}, and \spec{edge} keywords +% may be shorted to \spec{r}, \spec{c}, \spec{v}, and \spec{e}, +% respectively. Possible vertexes and edges are listed in +% \tablename~\ref{tab:hex:ve}. +% +% \begin{table}[htbp] +% \centering +% \begin{tabular}{m{.3\linewidth}m{.65\linewidth}} +% \begin{tikzpicture} +% \hex(r=0,c=0) +% \foreach \v in {E,NE,NW,W,SW,SE}{ +% \fill(hex cs:v=\v) circle(0.05); +% \node[inner sep=2pt] (v\v) at ($1.6*(hex cs:v=\v)$){\spec{v=\v}}; +% \draw[<-](hex cs:v=\v)--(v\v); } +% \foreach \e in {NE,N,NW,SW,S,SE}{ +% \fill(hex cs:e=\e) circle(0.05); +% \node[inner sep=2pt] (e\e) at ($1.6*(hex cs:e=\e)$) {\spec{e=\e}}; +% \draw[<-](hex cs:e=\e) -- (e\e);} +% \end{tikzpicture} +% & +% \begin{tabular}{|ccr|ccr|} +% \hline +% \rowcolor{headbg} +% \multicolumn{2}{c}{\color{headfg}\spec{vertex=}} +% & {\color{headfg}\textbf{Angle}} +% & \multicolumn{2}{c}{\color{headfg}\spec{edge=}} +% & {\color{headfg}\textbf{Angle}} +% \\ +% \hline +% \rowcolor{white} +% \spec{east} & \spec{E} & $ 0^{\circ}$ & +% \spec{north east} & \spec{NE} & $ 30^{\circ}$\\ +% \spec{north east} & \spec{NE} & $ 60^{\circ}$ & +% \spec{north} & \spec{N} & $ 90^{\circ}$\\ +% \spec{north west} & \spec{NW} & $120^{\circ}$ & +% \spec{north west} & \spec{NW} & $150^{\circ}$\\ +% \spec{west} & \spec{W} & $180^{\circ}$ & +% \spec{south west} & \spec{SW} & $210^{\circ}$\\ +% \spec{south west} & \spec{SW} & $240^{\circ}$ & +% \spec{south} & \spec{S} & $270^{\circ}$\\ +% \spec{south east} & \spec{SE} & $300^{\circ}$ & +% \spec{south east} & \spec{SE} & $330^{\circ}$\\ +% \hline +% \end{tabular} +% \end{tabular} +% \caption{Vertex and edge positions} +% \label{tab:hex:ve} +% \end{table} +% +% In \figurename~\ref{fig:hex:cs} is an example of a picture drawn in +% this coordinate system. +% +% \begin{figure}[htbp] +% \begin{tabular}{m{.3\linewidth}m{.65\linewidth}} +% \begin{tikzpicture}[] +% \hex[color=lightgray](r=0,c=0) +% \hex[color=lightgray](r=0,c=1) +% \hex[color=lightgray](r=1,c=0) +% \hex[color=lightgray](r=1,c=1) +% \draw[blue!50!black] (hex cs:r=0,c=0) -- (hex cs:r=1,c=1); +% \draw[red!50!black] (hex cs:r=0,c=0,vertex=E) -- +% (hex cs:r=1,c=1,edge=north west); +% \fill (hex cs:r=0,c=0) circle(.1) +% node[color=gray,anchor=north] {\spec{(r=0,c=0)}}; +% \fill (hex cs:r=1,c=1) circle(.1) +% node[color=gray,anchor=west] {\spec{(r=1,c=1)}}; +% \fill (hex cs:r=0,c=0,v=east) circle(.1) +% node[color=gray,anchor=north west]{\spec{(r=0,c=0,v=E)}}; +% \fill (hex cs:r=1,c=1,e=north west) circle(.1) +% node[color=gray,anchor=south]{ +% \spec{(r=1,c=1,e=NW)}}; +% \fill[lightgray](hex cs:r= .3,c= .3) circle(0.1) +% node[anchor=south,inner sep=0]{(0.3,0.3)}; +% \fill[lightgray](hex cs:r=1.3,c= .3) circle(0.1) +% node[anchor=south,inner sep=0]{(1.3,0.3)}; +% \fill[lightgray](hex cs:r=0.3,c=1.3) circle(0.1) +% node[anchor=south,inner sep=0]{(0.3,1.3)}; +% \fill[lightgray](hex cs:r=1.3,c=1.3) circle(0.1) +% node[anchor=south,inner sep=0]{(1.3,1.3)}; +% \end{tikzpicture} +% & +% Hexes and lines drawn with +% \begin{verbatim} +% \hex(0,0)\hex(0,1)\hex(1,0)\hex(1,1) +% \draw[blue!50!black] (hex cs:r=0,c=0) -- +% (hex cs:r=1,c=1); +% \draw[red!50!black] (hex cs:r=0,c=0,vertex=E) -- +% (hex cs:r=1,c=1,edge=NW); +% \fill[lightgray](hex cs:r= .3,c= .3) circle(0.1); +% \fill[lightgray](hex cs:r=1.3,c= .3) circle(0.1); +% \fill[lightgray](hex cs:r=0.3,c=1.3) circle(0.1); +% \fill[lightgray](hex cs:r=1.3,c=1.3) circle(0.1); +% \end{verbatim} +% \end{tabular} +% \caption{Hex coordinate system} +% \label{fig:hex:cs} +% \end{figure} +% +% +% \textbf{Important}: When the horizontal distance to the centre of a +% hex becomes less than $-\cos60^{\circ}$ or larger than +% $b-\cos60^{\circ}$ we effectively have a new hex column, and the +% coordinates are shifted upward or downward for smaller or larger +% numbers. Figure~\ref{fig:hex:coord:nb} illustrates. this. This can +% make it a little hard to specify coordinates relative to a hex +% centre. Alternatively one may use vertex or edge specifciations +% together with a relative offset in those directions. +% \ +% \begin{figure} +% \centering +% \begin{tikzpicture} +% \begin{scope}[scale=2,every node/.style={inner sep=0}] +% \hex +% +% \begin{scope}[red,fill] +% \draw[anchor=south east](hex cs:c=-0.66,r=-0.67)circle(.01)node{(-2/3,-2/3)}; +% \draw[anchor=south east](hex cs:c=-0.67,r=-0.33)circle(.01)node{(-2/3,-1/3)}; +% \draw[anchor=south east](hex cs:c=-0.67,r=0)circle(.01)node{(-2/3,0)}; +% \draw[anchor=south east](hex cs:c=-0.67,r=0.33)circle(.01)node{(-2/3,1/3)}; +% \draw[anchor=north](hex cs:c=-0.33,r=-0.67)circle(.01)node{(-1/3,-2/3)}; +% \draw[anchor=north](hex cs:c=-0.33,r=-0.33)circle(.01)node{(-1/3,-1/3)}; +% \draw[anchor=south](hex cs:c=-0.33,r=0.33)circle(.01)node{(-1/3,1/3)}; +% \draw[anchor=south](hex cs:c=-0.33,r=0.67)circle(.01)node{(-1/3,2/3)}; +% \draw[anchor=south](hex cs:c=0.33,r=-0.67)circle(.01)node{(1/3,-2/3)}; +% \draw[anchor=south](hex cs:c=0.33,r=-0.33)circle(.01)node{(1/3,-1/3)}; +% \draw[anchor=north](hex cs:c=0.33,r=0.33)circle(.01)node{(1/3,1/3)}; +% \draw[anchor=north](hex cs:c=0.33,r=0.67)circle(.01)node{(1/3,2/3)}; +% \draw[anchor=north west](hex cs:c=0.67,r=-0.33)circle(.01)node{(2/3,-1/3)}; +% \draw[anchor=north west](hex cs:c=0.67,r=0)circle(.01)node{(2/3,0)}; +% \draw[anchor=north west](hex cs:c=0.67,r=0.33)circle(.01)node{(2/3,1/3)}; +% \draw[anchor=north west](hex cs:c=0.67,r=0.67)circle(.01)node{(2/3,2/3)}; +% \end{scope} +% +% \hex(c=2) +% \begin{scope}[blue,fill] +% \draw[anchor=south west](hex cs:c=2,v=NE,o=0.5)circle(.01)node{NE by 1/2}; +% \draw[anchor=south west](hex cs:c=2,v=NE,o=1.0)circle(.01)node{NE by 1}; +% \draw[anchor=south west](hex cs:c=2,v=NE,o=1.5)circle(.01)node{NE by 3/2}; +% \draw[anchor=south east](hex cs:c=2,v=NW,o=0.5)circle(.01)node{NW by 1/2}; +% \draw[anchor=south east](hex cs:c=2,v=NW,o=1.0)circle(.01)node{NW by 1}; +% \draw[anchor=south east](hex cs:c=2,v=NW,o=1.5)circle(.01)node{NW by 3/2}; +% \draw[anchor=north](hex cs:c=2,v=W,o=0.5)circle(.01)node{W by 1/2}; +% \draw[anchor=south](hex cs:c=2,v=W,o=1.0)circle(.01)node{W by 1}; +% \draw[anchor=north](hex cs:c=2,v=W,o=1.5)circle(.01)node{W by 3/2}; +% \draw[anchor=north east](hex cs:c=2,v=SW,o=0.5)circle(.01)node{SW by 1/2}; +% \draw[anchor=north east](hex cs:c=2,v=SW,o=1.0)circle(.01)node{SW by 1}; +% \draw[anchor=north east](hex cs:c=2,v=SW,o=1.5)circle(.01)node{SW by 3/2}; +% \draw[anchor=north west](hex cs:c=2,v=SE,o=0.5)circle(.01)node{SE by 1/2}; +% \draw[anchor=north west](hex cs:c=2,v=SE,o=1.0)circle(.01)node{SE by 1}; +% \draw[anchor=north west](hex cs:c=2,v=SE,o=1.5)circle(.01)node{SE by 3/2}; +% \draw[anchor=north](hex cs:c=2,v=E,o=0.5)circle(.01)node{E by 1/2}; +% \draw[anchor=south](hex cs:c=2,v=E,o=1.0)circle(.01)node{E by 1}; +% \draw[anchor=north](hex cs:c=2,v=E,o=1.5)circle(.01)node{E by 3/2}; +% \end{scope} +% \end{scope} +% \end{tikzpicture} +% \caption{Relative coordinates} +% \label{fig:hex:coords:nb} +% \end{figure} +% \subsection{Terrains} +% \label{sec:hex:terrain} +% +% Terrains are rendered using tile images or \TikZ{} +% \texttt{pic}tures. The available terrains are shown in +% \tablename{}s~\ref{tab:hex:terrain:image} +% and~\ref{tab:hex:terrain:pic}. Users can provide their own tile +% images and select those via \texttt{terrain=\{image=\meta{image}\}} +% or defined \TikZ{} \texttt{pic}tures and select those via +% \texttt{terrain=\{pic=\meta{pic-name}\}}. In all cases, the terrain +% graphics is clipped to the hex. +% +% The terrain of a hex is selected via the multi-valued key +% \spec{terrain}. Sub-keys of this key are +% +% \begin{description} +% \item[\spec{image=}\meta{graphics-file}] Specifies terrain tile +% image \meta{graphics-file}. +% \item[\spec{pic=}\meta{picture-key}] Specifies terrain tile \TikZ{} +% \spec{pic}ture. +% \item[\spec{code=}\meta{tikz-code}] Any valid \TikZ{} code +% \item[\spec{clip=}\meta{path(s)}] \TikZ{} path specification to clip +% the terrain within the hex. +% \end{description} +% +% \begin{table}[htbp] +% \centering +% \begin{tabular}{|m{2cm}|ll|m{2cm}|ll|} +% \hline +% \rowcolor{headbg} +% {\color{headfg}\textbf{Symbol}} +% & {\color{headfg}\textbf{Name}} +% & {\color{headfg}\texttt{terrain=\{image=\meta{image}\}}} +% & {\color{headfg}\textbf{Symbol}} +% & {\color{headfg}\textbf{Name}} +% & {\color{headfg}\texttt{terrain=\{image=\meta{image}\}}}\\ +% \hline +% &&&&&\\[-1ex] +% \tikz{\hex[](r=0,c=0) } +% & Clear +% & \texttt{} +% & \tikz{\hex[terrain={image=beach}](r=0,c=0) } +% & Beach +% & \texttt{\{image=beach\}}\\ +% \tikz{\hex[terrain={image=light_woods}](r=0,c=0) } +% & Light woods +% & \texttt{\{image=light\_woods\}} +% & \tikz{\hex[terrain={image=woods}](r=0,c=0)} +% & Woods +% & \texttt{\{image=woods\}}\\ +% \tikz{\hex[terrain={image=rough}](r=0,c=0) } +% & Rough +% & \texttt{\{image=rough\}} +% & \tikz{\hex[terrain={image=swamp}](r=0,c=0) } +% & Swamp +% & \texttt{\{image=swamp\}}\\ +% \tikz{\hex[terrain={image=mountains}](r=0,c=0) } +% & Mountains +% & \texttt{\{image=mountains\}} +% & \tikz{\hex[fill=blue!40!white](r=0,c=0) } +% & Sea +% & \texttt{\{image=sea\}}\\ +% \hline +% \end{tabular} +% \caption{Terrains specified via tile images} +% \label{tab:hex:terrain:image} +% \end{table} +% +% \begin{table}[htbp] +% \centering +% \begin{tabular}{|m{2cm}|l|l|} +% \hline +% \rowcolor{headbg} +% {\color{headfg}\textbf{Symbol}} +% & {\color{headfg}\textbf{Name}} +% & {\color{headfg}\texttt{terrain=\{pic=\meta{image}\}}}\\ +% \hline +% &&\\[-1ex] +% \tikz{\hex[terrain={pic=hex/terrain/mountain,line width=3pt}](r=0,c=0) } +% & Mountains +% & \texttt{\{pic=hex/terrain/mountain,line width=3pt\}}\\ +% \hline +% \end{tabular} +% \caption{Terrains specified via \TikZ{} \spec{pic}tures} +% \label{tab:hex:terrain:pic} +% \end{table} +% +% The terrain can be clipped by the sub-key \spec{clip}. This can be +% useful if the game specifies movement costs in terms of hex-edge +% crossing, for example \emph{First Blood}~\cite{fb}. In that case, a +% hex may be, for example, a jungle hex, but some edges a clear. Thus +% movements across such an edge would count as moving into clear +% territory while moving over other edges will count as moving into a +% jungle. This is, of course, not how most games count movement +% costs, but this package nonetheless facilitates such rules. +% \tablename~\ref{tab:hex:terrain:clip} shows a few examples of +% predefined clippings of terrain. +% +% Users can define \TikZ{} \spec{pic}tures that specify clipping paths +% as needed. For example, one could add clipping to the terrain to +% ensure that other graphics in the hex stands out. +% +% \begin{table}[htbp] +% \centering +% \begin{tabular}{|m{2cm}m{.3\linewidth}|m{2cm}m{.3\linewidth}|} +% \hline +% \rowcolor{headbg} +% {\color{headfg}\textbf{Symbol}} +% & {\color{headfg}\texttt{terrain=\{clip=,...\}}} +% & {\color{headfg}\textbf{Symbol}} +% & {\color{headfg}\texttt{terrain=\{clip=,...\}}}\\ +% \hline +% &&&\\ +% \tikz{\hex[terrain={woods, +% clip={hex/sextant=NE}}](r=0,c=0) } +% & \spec{\{hex/sextant=NE\}} +% & \tikz{\hex[terrain={woods, +% clip={ +% hex/large sextant=NE, +% hex/large sextant=N}}](r=0,c=0) } +% & \spec{\{hex/large sextant=NE,hex/large sextant=N\}}\\ +% \hline +% \tikz{\hex[terrain={woods, +% clip={hex/sextant=N}}](r=0,c=0) } +% & \spec{\{hex/sextant=N\}} +% & \tikz{\hex[terrain={woods, +% clip={hex/sextant=NE, +% hex/sextant=N, +% hex/sextant=NW}}](r=0,c=0) } +% & \spec{\{hex/sextant=NE, +% hex/sextant=N, +% hex/sextant=NW\}}\\ +% \hline +% \tikz{\hex[terrain={woods, +% clip={hex/sextant=NW}}](r=0,c=0) } +% & \spec{\{hex/sextant=NW\}} +% & \tikz{\hex[terrain={woods, +% clip={hex/sextant=NE, +% hex/sextant=N, +% hex/sextant=NW, +% hex/sextant=SW}}](r=0,c=0) } +% & \spec{\{hex/sextant=NE, +% hex/sextant=N, +% hex/sextant=NW, +% hex/sextant=SW\}}\\ +% \hline +% \tikz{\hex[terrain={woods, +% clip={hex/sextant=SW}}](r=0,c=0) } +% & \spec{\{hex/sextant=SW\}} +% & \tikz{\hex[terrain={woods, +% clip={hex/sextant=NE, +% hex/sextant=N, +% hex/sextant=NW, +% hex/sextant=SW, +% hex/sextant=S}}](r=0,c=0) } +% & \spec{\{hex/sextant=NE, +% hex/sextant=N, +% hex/sextant=NW, +% hex/sextant=SW, +% hex/sextant=S\}}\\ +% \hline +% \tikz{\hex[terrain={woods, +% clip={hex/sextant=S}}](r=0,c=0) } +% & \spec{\{hex/sextant=S\}} +% & \tikz{\hex[terrain={woods, +% clip={hex/sextant=NE, +% hex/sextant=N, +% hex/sextant=NW, +% hex/sextant=SW, +% hex/sextant=S, +% hex/sextant=SE}}](r=0,c=0) } +% & \spec{\{hex/sextant=NE, +% hex/sextant=N, +% hex/sextant=NW, +% hex/sextant=SW, +% hex/sextant=S, +% hex/sextant=SE\}}\\ +% \hline +% \tikz{\hex[terrain={woods, +% clip={hex/sextant=SE}}](r=0,c=0) } +% & \spec{\{hex/sextant=SE\}} +% & \tikz{\hex[terrain={woods, +% clip={hex/sextant=NE, +% hex/sextant=N, +% hex/sextant=NW, +% hex/sextant=SW, +% hex/sextant=S, +% hex/sextant=SE, +% hex/sextant=C}}](r=0,c=0) } +% & \spec{\{hex/sextant=NE, +% hex/sextant=N, +% hex/sextant=NW, +% hex/sextant=SW, +% hex/sextant=S, +% hex/sextant=SE, +% hex/sextant=C\}}\\ +% \hline +% \tikz{\hex[terrain={woods, +% clip={hex/sextant=C}}](r=0,c=0) } +% & \spec{\{hex/sextant=C\}} +% & \tikz{\hex[terrain={woods, +% clip={hex/sextant=NE, +% hex/sextant=N, +% hex/sextant=S, +% hex/sextant=SE, +% hex/sextant=C}}](r=0,c=0) } +% & \spec{\{hex/sextant=NE, +% hex/sextant=N, +% hex/sextant=S, +% hex/sextant=SE, +% hex/sextant=C\}}\\ +% \hline +% \end{tabular} +% \caption{Terrain clipped via \spec{clip} sub-key} +% \label{tab:hex:terrain:clip} +% \end{table} +% +% \subsubsection{Styling terrains} +% +% Terrains use the key \spec{tikz/hex/terrain} to render the +% terrains. This is mainly useful for terrains made from \TikZ{} +% \spec{pic}tures. +% +% \subsection{Ridges} +% \label{sec:hex:ridges} +% +% Ridges, or hill or mountain slopes, can be added to a hex via the +% keyword \spec{ridges}. The keyword takes a list of hex edges and +% generates symbology for the ridge on the chosen edges. Note that +% the edges does not have to be continuous, as illustrated in the +% bottom right of \tablename~\ref{tab:hex:ridges}, nor in any +% particular order. The edges are specified as compass direction +% +% \begin{Syntax} +% north east, north, north west, south west, south, south east.\\ +% NE, N, NW, SW, S, SE +% \end{Syntax} +% +% \tablename~\ref{tab:hex:ridges} shows some examples. +% +% \begin{table}[htbp] +% \centering +% \begin{tabular}{|m{2cm}|c|m{2cm}|c|} +% \hline +% \rowcolor{headbg} +% {\color{headfg}\textbf{Symbol}} +% & {\color{headfg}\spec{ridges=}} +% & {\color{headfg}\textbf{Symbol}} +% & {\color{headfg}\spec{ridges=}}\\ +% \hline +% &&&\\[-1ex] +% \tikz{\hex[ridges=NE]} +% & \spec{NE} +% & \tikz{\hex[ridges={NE,N}]} +% & \spec{NE,N}\\ +% \tikz{\hex[ridges=N]} +% & \spec{N} +% & \tikz{\hex[ridges={NE,N,NW}]} +% & \spec{NE,N,NW}\\ +% \tikz{\hex[ridges=NW]} +% & \spec{NW} +% & \tikz{\hex[ridges={NE,N,NW,SW}]} +% & \spec{NE,N,NW,SW}\\ +% \tikz{\hex[ridges=SW]} +% & \spec{SW} +% & \tikz{\hex[ridges={NE,N,NW,SW,S,line width=3pt}]} +% & \spec{NE,N,NW,SW,S,line width=3pt}\\ +% \tikz{\hex[ridges=S]} +% & \spec{S} +% & \tikz{\hex[ridges={NE,N,NW,SW,S,SE,color=brown!70!black}]} +% & \spec{NE,N,NW,SW,S,SE,color=brown!70!black}\\ +% \tikz{\hex[ridges=SE]} +% & \spec{SE} +% & \tikz{\hex[ridges={N,S,NW,SE},terrain={rough}]} +% & \spec{N,S,NW,SE}\\ +% \hline +% \end{tabular} +% \caption{Ridges} +% \label{tab:hex:ridges} +% \end{table} +% +% \subsubsection{Styling ridges} +% +% Every ridge is drawn with the style \spec{tikz/hex/ridges}. Users +% can customise this style. The default is to draw thin black wave +% lines (\TikZ{} decoration \spec{waves}). The default style also +% takes care to auto scale line widths. +% +% \subsection{Labels} +% \label{sec:hex:label} +% +% Labels can be placed on the hexes via the keyword \spec{label}. The +% label can either be auto-generated or given explicitly. +% \tablename~\ref{tab:hex:label} shows the various choices. +% +% \begin{table}[htbp] +% \centering +% \begin{tabular}{|m{2cm}|l|c|m{6cm}|} +% \hline +% \rowcolor{headbg} +% {\color{headfg}\textbf{Symbol}} +% & {\color{headfg}\textbf{Name}} +% & {\color{headfg}\textbf{Column/Row}} +% & {\color{headfg}\spec{label=}}\\ +% \hline +% &&&\\[-1ex] +% \tikz{\hex[label=none](r=0,c=0) } +% & No label +% & n/a +% & \spec{none}\\ +% \tikz{\hex[label={text=B10}](r=0,c=0) } +% & User specified +% & n/a +% & \spec{text=B10}\\ +% \tikz{\hex[label={color=blue,text=A1}](r=0,c=0) } +% & User specified +% & n/a +% & \spec{\{color=blue,text=A1\}}\\ +% \tikz{\hex[label=auto](r=3,c=9) } +% & Two-digit, zero padded numbers +% & 9/3 +% & \spec{auto}\\ +% \tikz{\hex[label={auto=alpha column,font=\noexpand\rmfamily}](r=3,c=2)} +% & Column letter, number row +% & 2/3 +% & \spec{\{auto=alpha column,font=\cs{noexpand}\cs{rmfamily}\}} +% \textsuperscript{$\dag$}\\ +% \tikz{\hex[label={auto=alpha 2 column,anchor=north east}](r=24,c=6) } +% & Two letter column, two digit row +% & 6/24 +% & \spec{\{auto=alpha 2 column,anchor=north east\}}\\ +% \hline +% \end{tabular} +% \caption{Labels\newline +% \textsuperscript{$\dag$}When specifying macros as key values in +% the options, for example the value \cs{rmfamily} for the key +% \spec{font} above, we have to put a \cs{noexpand} in front if the +% macro. This is to prevent early expansion of the macro, which +% would cause errors. A minor nuisance.} +% \label{tab:hex:label} +% \end{table} +% +% The option \spec{auto=inv y x plus 1} will label the rows +% inversely, and add one to the column number. This requires that the +% key \spec{tikz/max hex row} has been set to the largest row number +% used. +% +% In addition to the sub-keys \spec{none}, \spec{auto}, and +% \spec{text}, one can also specify the following keys +% +% \begin{description} +% \item[\keyval{place}{\meta{coordinates}}] specifies the Location of +% label within the hex. The anchor point of the text will be placed +% at this point. +% \item[\oarg[options]] at the start of the option (but inside braces +% \spec{\{\textellipsis\}}) can be used to give additional style +% options. +% \end{description} +% +% \subsubsection{Styling labels} +% +% All labels use the style \spec{tikz/hex/label}. By default, this +% places the label at the top of the hex, and renders the text as gray +% script sized text. Users can customise this style. If a user does +% not want to change the default style, or want to pass the same +% option to all labels, then one can set the key \spec{tikz/every +% label} to those options. +% +% +% \subsection{Towns} +% \label{sec:hex:town} +% +% Towns in hexes are made via the key \spec{town}. This key takes +% several sub-keys, as illustrated in \tablename~\ref{tab:hex:town} +% +% +% \begin{table}[htbp] +% \centering +% \begin{tabular}{|m{2cm}l|m{2cm}l|} +% \hline +% \rowcolor{headbg} +% {\color{headfg}\textbf{Symbol}} +% & {\color{headfg}\spec{town=}} +% & {\color{headfg}\textbf{Symbol}} +% & {\color{headfg}\spec{town=}}\\ +% \hline +% &&&\\[-1ex] +% \tikz{\hex[town](r=0,c=0) } +% & \spec{} +% & \tikz{\hex[town={name=Copenhagen}](r=0,c=0) } +% & \spec{\{name=Copenhagen\}}\\ +% \tikz{\hex[town={pic=hex/town/city}](r=0,c=0) } +% & \spec{\{pic=hex/town/city\}} +% & \tikz{\hex[town={red,pic=hex/town/city}](r=0,c=0) } +% & \spec{\{red,pic=hex/town/city\}}\\ +% \tikz{\hex[town={fill=red}](r=0,c=0) } +% & \spec{\{fill=red\}} +% & \tikz{\hex[town={pic=hex/town/city,name=London}](r=0,c=0) } +% & \spec{\{name=London\}}\\ +% \tikz{\hex[town={color=red,name=Paris}](r=0,c=0) } +% & \spec{\{red,name=Paris\}} +% &\tikz{\hex[town={above=0.8,name=Berlin}](r=0,c=0) } +% & \spec{\{above=0.8,name=Berlin\}}\\ +% \tikz{\hex[town={place={(.2,.2)}}](r=0,c=0) } +% & \spec{\{place=\{(.2,.2)\}\}} +% &\tikz{\hex[town={font=\noexpand\itshape,name=Amsterdam}](r=0,c=0) } +% & \spec{\{font=\cs{noexpand}\cs{itshape},name=Amsterdam\}} +% \textsuperscript{$\dag$}\\ +% \hline +% \end{tabular} +% \caption{Towns\newline +% \textsuperscript{$\dag$}When specifying macros as key values in +% the options, for example the value \cs{rmfamily} for the key +% \spec{font} above, we have to put a \cs{noexpand} in front if the +% macro. This is to prevent early expansion of the macro, which +% would cause errors. A minor nuisance.} +% \label{tab:hex:town} +% \end{table} +% +% The sub-keys available for the \spec{town} key are +% +% \begin{description} +% \item[\keyval{pic}{\meta{town-pic}}] The name of a \TikZ{} +% \spec{pic}ture. Currently defined are \spec{hex/town/town} and +% \spec{hex/town/city}. Users can provide alternate definitions or new types +% by defining \TikZ{} \spec{pic}tures. +% \item[\keyval{place}{\meta{coordinates}}] Location of label within +% the hex. The anchor point of the text will be placed at this +% point. +% \item[\keyval{name}{\meta{name}}] Name of town +% \end{description} +% +% \subsubsection{Styling towns} +% +% Towns uses two styles: \spec{tikz/hex/town} for the town graphics, +% and \spec{tikz/hex/town name} for the name of the town. In addition, +% a user may set the key \spec{tikz/every hex town} to contain options +% to be passed to all towns. +% +% \subsection{Extra graphics for hexes} +% \label{sec:hex:extra} +% +% Additional graphics for hexes can be added by the two keys +% \spec{extra} and \spec{extra clipped}. The difference between the +% two are that graphics specified by \spec{extra clipped} are clipped +% (restricted) to the hex, while graphics given by \spec{extra} may +% extend beyond the hex. Both keys accept a comma separated list of +% arguments, where each element has the syntax +% +% \begin{Syntax} +% \oarg{options}\parg{placement}\meta{picture} +% \end{Syntax} +% +% Both \meta{options} and \meta{placement} are optional, and specifies +% keys to draw \meta{picture} with and the relative location in the +% hex, respectively. The required argument \meta{picture} must name a +% \TikZ{} \spec{pic}ture, for example \spec{hex/fortress}. This can +% be useful for marking hexes on the board. For example to mark a +% set-up hex for one faction of the game. +% +% One could for example define the following pictures to define set-up +% points for a Sovjet and German faction +% +% \tikzset{ +% setup/sovjet/.pic={ +% \path[fill=red,draw=yellow,pic actions] +% ( 90:.4)--(126:.15)-- +% (162:.4)--(198:.15)-- +% (234:.4)--(270:.15)-- +% (306:.4)--(342:.15)-- +% ( 18:.4)--( 54:.15)--cycle;}, +% setup/german/.pic={ +% \path[fill,pic actions] +% (-.4, -.1) rectangle(.4,.1) +% (-.1, -.4) rectangle(.1,.4); +% \path[draw,pic actions] +% (-.4,-.2) -- (-.2,-.2) -- (-.2,-.4) +% (-.4, .2) -- (-.2, .2) -- (-.2, .4) +% ( .4, .2) -- ( .2, .2) -- ( .2, .4) +% ( .4,-.2) -- ( .2,-.2) -- ( .2,-.4);}, +% foo/large/.pic={ +% \path[fill=gray,pic actions] (-1,-.5) rectangle(1,.5);}, +% } +% \begin{verbatim} +% setup/sovjet/.pic={ +% \path[fill=red,draw=yellow,pic actions] +% ( 90:.4)--(126:.15)-- +% (162:.4)--(198:.15)-- +% (234:.4)--(270:.15)-- +% (306:.4)--(342:.15)-- +% ( 18:.4)--( 54:.15)--cycle;}, +% setup/german/.pic={ +% \path[fill,pic actions] +% (-.4, -.1) rectangle(.4,.1) +% (-.1, -.4) rectangle(.1,.4); +% \path[draw,pic actions] +% (-.4,-.2) -- (-.2,-.2) -- (-.2,-.4) +% (-.4, .2) -- (-.2, .2) -- (-.2, .4) +% ( .4, .2) -- ( .2, .2) -- ( .2, .4) +% ( .4,-.2) -- ( .2,-.2) -- ( .2,-.4);} +% foo/large/.pic={ +% \path[fill=gray,pic actions] (-1,-.5) rectangle(1,.5);}, +% } +% \end{verbatim} +% +% We can place extra graphics in hexes as shown in +% \tablename~\ref{tab:hex:extra}. +% +% \begin{table}[htbp] +% \centering +% \begin{tabular}{|m{2cm}l|} +% \hline +% \rowcolor{headbg} +% {\color{headfg}\textbf{Symbol}} +% & {\color{headfg}\spec{extra=}}\\ +% \hline +% &\\[-1ex] +% \tikz{\hex[extra=hex/fortress](r=0,c=0) } +% & \spec{hex/fortress}\\ +% \tikz{\hex[extra=setup/sovjet](r=0,c=0) } +% & \spec{setup/sovjet}\\ +% \tikz{\hex[extra=setup/german](r=0,c=0) } +% & \spec{setup/german}\\ +% \tikz{\hex[extra={setup/german,hex/fortress}](r=0,c=0) } +% & \spec{\{setup/german,hex/fortress\}}\textsuperscript{$\dag$}\\ +% \tikz{\hex[extra={[{line width=2pt,color=brown}]hex/fortress 2}](r=0,c=0) } +% & \spec{\{[\{line width=2pt,brown\}] +% fortress 2\}}\textsuperscript{$\ddag$}\\ +% \tikz{\hex[extra={[shift={(.2,.2)}]setup/sovjet}](r=0,c=0) } +% & \spec{\{[shift=\{(.2,.2)\}]setup/sovjet\}}\textsuperscript{$\ddag$}\\ +% \tikz{\hex[extra={[{shift={(.2,.2)},scale=.5,color=gray}]setup/german}](r=0,c=0) } +% & \spec{\{[\{shift=\{(.2,.2)\},scale=.5,color=gray\}] +% setup/german\}}\textsuperscript{$\ddag$}\\ +% \tikz{\hex[extra=foo/large]} & \spec{foo/large}\\ +% \rowcolor{headbg} +% {\color{headfg}\textbf{Symbol}} +% & {\color{headfg}\spec{extra clipped=}}\\ +% \hline +% &\\[-1ex] +% \iftrue +% \tikz{\hex[extra clipped=foo/large]} & \spec{foo/large}\\ +% \fi +% \hline +% \end{tabular} +% \caption{Hex extra graphics. Note that in the last line we use +% the graphics \spec{foo/large} with \spec{extra clipped} (compare +% to line just above) to restrict the graphics to the hex.\newline% +% \textsuperscript{$\dag$}When specifying more than one item, the +% list must be enclosed in braces +% (\spec{\{\textellipsis\}})\newline% +% \textsuperscript{$\ddag$}When an item in the list of \spec{extra} +% contains a comma (\spec{,}), for example in a list of graphics +% options, then we need to enclose the inner list \emph{and} the +% whole list in braces (\spec{\{\textellipsis\}}) to protect against +% unwanted expansion.} +% \label{tab:hex:extra} +% \end{table} +% +% To finish off this part on hexes and what we can do with those, we +% generate a map in \figurename~\ref{fig:hex:placing}. +% +% \begin{figure}[htbp] +% \centering +% \begin{tabular}{m{.3\linewidth}m{.68\linewidth}} +% \begin{tikzpicture}[scale=.8] +% \hex[town={pic=hex/town/city,name=Berlin}](r=0,c=0) +% \hex[] (r=0,c=1) +% \hex[] (r=0,c=2) +% \hex[terrain={swamp},label=auto] (r=0,c=3) +% \hex[] (r=1,c=0) +% \hex[terrain={light woods}] (r=1,c=1) +% \hex[terrain={woods}] (r=1,c=2) +% \hex[terrain={swamp}] (r=1,c=3) +% \hex[town={name=Freiburg},extra=hex/fortress](r=2,c=0) +% \hex[extra=hex/fortress] (r=2,c=1) +% \hex[terrain={rough}] (r=2,c=2) +% \hex[] (r=2,c=3) +% \hex[terrain={mountains}] (r=3,c=0) +% \hex[terrain={mountains}] (r=3,c=1) +% \hex[terrain={mountains}] (r=3,c=2) +% \hex[] (r=3,c=3) +% \end{tikzpicture} +% & +% \begin{verbatim} +% \hex[town={pic=hex/town/city,name=Berlin}] (r=0,c=0) +% \hex[] (r=0,c=1) +% \hex[] (r=0,c=2) +% \hex[terrain={swamp},label=auto] (r=0,c=3) +% \hex[] (r=1,c=0) +% \hex[terrain={light woods}] (r=1,c=1) +% \hex[terrain={woods}] (r=1,c=2) +% \hex[terrain={swamp}] (r=1,c=3) +% \hex[town={name=Freiburg},extra=hex/fortress](r=2,c=0) +% \hex[extra=hex/fortress] (r=2,c=1) +% \hex[terrain={rough}] (r=2,c=2) +% \hex[] (r=2,c=3) +% \hex[terrain={mountains}] (r=3,c=0) +% \hex[terrain={mountains}] (r=3,c=1) +% \hex[terrain={mountains}] (r=3,c=2) +% \hex[] (r=3,c=3) +% \end{verbatim} +% \end{tabular} +% \caption{Placing hexes} +% \label{fig:hex:placing} +% \end{figure} +% +% \subsection{Rivers, borders, and roads} +% +% Rivers and borders follow the hex sides and are added to the current +% \spec{tikkzpicture} using \cs{river} and \cs{border} macros +% respectively. They are specified as regular \TikZ{} paths. It is +% useful to utilise the hex coordinate system for this. +% +% \begin{MacroSyntax}{\river,\border} +% \cs{river}\oarg{options} \meta{path};\\ +% \cs{border}\oarg{options} \meta{path}; +% \end{MacroSyntax} +% +% Rivers are essentially borders, but are randomized to giver a more +% aesthetically pleasing output. +% +% Roads and railroads typically go from hex--center to hex--center, +% and are added using the macro \cs{road}. The road or railroad is +% specified via a regular \TikZ{} path. +% +% \begin{MacroSyntax}{\addriver} +% \cs{road}\oarg{options} \meta{path};\\ +% \cs{railroad}\oarg{options} \meta{path}; +% \end{MacroSyntax} +% +% Towns and cities conveniently serve as places to split up a road at. +% +% \begin{figure}[htbp] +% \centering +% \begin{tikzpicture} +% \testmap +% \end{tikzpicture} +% \caption{Adding rivers, boarders, and roads} +% \end{figure} +% +% \subsection{Board clipping and frame} +% +% In the river, border, and road example above, the roads extend beyond +% the hexes, which does not look very nice. One way to deal with this, +% is to draw a clipping box around the hexes +% +% \begin{figure}[htbp] +% \centering +% \begin{tabular}{m{.\linewidth}m{.\linewidth}} +% \begin{tikzpicture} +% \draw[clip](-.5,-.5) rectangle (5,5); +% \testmap +% \end{tikzpicture} +% & +% \begin{verbatim} +% \draw[clip](-.5,-.5) rectangle (5,5); +% \testmap +% \end{verbatim} +% \end{tabular} +% \caption{Clipping for a manual using a \TikZ{} +% \cs{draw}\spec{[clip]} command.} +% \label{fig:hex:boxclip} +% \end{figure} +% +% This technique works fine for examples in a manual, it has a +% somewhat displeasing effect for a full board. The package therefor +% defines the macro \cs{boardclip} which clips the graphics +% according to the defined hexes. +% +% \begin{MacroSyntax}{\boardclip} +% \cs{boardclip}\parg{lower-left}\parg{upper-right}\marg{options} +% \end{MacroSyntax} +% +% A clipping path of that spans from the hex at \meta{lower-lest} to +% \meta{upper-right}. Note, that both of these arguments should only +% specify the column and row keys. If \meta{options} is non-empty, +% then the clipping path is drawn with those options. +% +% \begin{figure}[htbp] +% \centering +% \begin{tabular}{m{.4\linewidth}m{.4\linewidth}} +% \begin{tikzpicture} +% \begin{scope} +% \boardclip(c=0,r=0)(c=3,r=3){} +% \testmap +% \end{scope} +% \end{tikzpicture} +% & +% \begin{verbatim} +% \begin{scope} +% \boardclip(c=0,r=0)(c=3,r=3){} +% \testmap +% \end{scope} +% \end{verbatim} +% \end{tabular} +% \caption{Snug--fit clipping of board using the macro \cs{boardclip}} +% \label{fig:hex:clip} +% \end{figure} +% +% This is particularly useful together with the \cs{boardframe} macro. +% This macro will put a frame around the board, optionally with a +% margin. +% +% \begin{MacroSyntax}{\boardframe} +% \cs{boardframe}\oarg{margin}\parg{lower-left}{upper-right} +% \end{MacroSyntax} +% +% where \meta{lower-left} and \meta{upper-right} are as for +% \cs{boardclip}. The \meta{margin} must be a number, and specifies an +% optional margin around the hexes, The argument \meta{options} +% specifies how the frame is drawn. The idea is to first draw the +% frame, then the clipping shape, and then the hexes. One should take +% care to use the \meta{options} argument to \cs{boardclip} to specify +% a default background color. The frame is drawn with the style +% \spec{hex/board frame} +% +% \begin{figure}[htbp] +% \centering +% \begin{tabular}{m{4.\linewidth}m{4.\linewidth}} +% \begin{tikzpicture}[hex/border/.append style={color=red}, +% hex/board frame/.style={fill=Tan}] +% \begin{scope}[every hex/.style={label=auto}] +% \boardframe[0.5](c=0,r=0)(c=3,r=3){0.5} +% \boardclip(c=0,r=0)(c=3,r=3){fill=white} +% \testmap{} +% \end{scope} +% \end{tikzpicture} +% & +% \begin{verbatim} +% \begin{scope}[every hex/.style={label=auto}] +% \boardframe[0.5](c=0,r=0)(c=3,r=3) +% \boardclip(c=0,r=0)(c=3,r=3){fill=white} +% \testmap{} +% \end{scope} +% \end{verbatim} +% \end{tabular} +% \caption{Combining a frame and clipping} +% \label{fig:hex:frame} +% \end{figure} +% +% The \cs{boardframe} macro prints the position of the rectangle to +% the log output, if one needs to do some more stuff around the board. +% +% \iffalse +% -------------------------------------------------------------------- +% +% Chits +% +% -------------------------------------------------------------------- +% \fi +% +% \cleardoublepage +% \section{Chits} +% +% Chits, or playing counters\footnote{Since \TeX{} has the concept of +% counters as in `\cs{count}' and \LaTeX{}'s `\cs{newcounter}', we +% choose the name `chit' for playing pieces instead.}, can be made +% with the macro \cs{chit}. The syntax for rendering a chit is +% +% \begin{MacroSyntax}{\chit} +% \cs{chit}\oarg{key-value-pairs}\parg{location}\parg{name} +% \end{MacroSyntax} +% +% \figurename~\ref{fig:chit:overview} shows an example of a chit. +% +% \begin{figure}[htbp] +% \centering +% \begin{tikzpicture}[scale=2] +% \firstchit +% \pic[draw,transform shape]{wg/x axis={-1,1, -1.2,{0},{-.6,.6}}}; +% \pic[draw,transform shape]{wg/y axis={1.2,-1,1, {0},{-.6,.6}}}; +% \draw[wg arrow] (-.2,-.4)--(-0.9,-.6) +% node[anchor=east]{\spec{factors=\{chit/2 factors=\{4,8\}\}}}; +% \draw[wg arrow] (-.5,.2)--(-1.1,.6) +% node[anchor=east]{\spec{left=\{chit/identifier=\{1\}\}}}; +% \draw[wg arrow] (.5,.2)--(.7,1.2) +% node[anchor=south west]{\spec{right=\{chit/identifier=\{2\}\}}}; +% \draw[wg arrow] (-.2,.4)--(-1,1) +% node[anchor=east]{\spec{symbol=\{\meta{nato app 6(c) spec}\}}}; +% \end{tikzpicture} +% \caption{An example of a chit. The lines below and to the right +% shows two unit lengths. Other global options used are +% \spec{color=white} to set the foreground colour, \spec{fill=blue} +% for the background, and \spec{text=yellow} to set the font colour +% to yellow. The \spec{symbol} key also contains +% \spec{frame=\{fill=yellow!50!black} to set the frame fill colour, +% and \spec{ultra thick} to set the line width of the NATO App6(C) +% symbol. Note that the line width is automatically scaled.} +% \label{fig:chit:overview} +% \end{figure} +% +% +% The example in \figurename~\ref{fig:chit:overview} shows an infantry +% mountaineer army unit with attack factor 4, and movement factor 8. +% The NATO App6(c) symbol is given in terms of keywords for the +% \cs{natoapp} macro (see \sectionname~\ref{sec:nateoapp6c}). The +% other parts of the chit (\spec{factors}, \spec{left}, \spec{right}, +% and \spec{below}) are rendered onto the chit via \TikZ{} +% \spec{pic}tures. This allows for a great deal of flexibility in +% generating chits. For example, above we use the \spec{pic}tures +% \spec{chit/identifier} and \spec{chit/2 factors} to render the left- +% and right-hand identifiers, and the factors, respectively. +% +% Full frame chits --- that is chits which are not typically +% designating units or faction specific chits, e.g., a turn marker --- +% can be made by using the key \spec{full}. In that case, all other +% keys (\spec{symbol}, \spec{factors}, \spec{left}, \spec{right}, +% and \spec{below}) are ignored. \figurename~\ref{fig:chit:full} shows +% such an example. +% +% \begin{figure}[tbp] +% \centering +% \begin{tabular}{m{.45\linewidth}m{.45\linewidth}} +% \begin{tikzpicture}[scale=2] +% \turnchit +% \end{tikzpicture} +% & +% chit made with +% \begin{verbatim} +% \tikzset{ +% wg/big text/.pic={ +% \node[font=\sffamily\fontsize{18}{0}% +% \selectfont]{#1};}} +% \tikz{ +% \chit[full={wg/big text={Turn}}, +% black,fill=yellow!20!white](0,0)} +% \end{tikzpicture} +% \end{verbatim} +% \end{tabular} +% \caption{An example of a full-frame chit. } +% \label{fig:chit:full} +% \end{figure} +% +% The size of the chits are $1.2\times1.2$ unit lengths squared. This +% is tuned so that the chits will fit within the hexes produced by the +% \cs{hex} command (see \sectionname~\label{sec:hex}). In +% \figurename~\ref{fig:chit:hex} we illustrate this. Typically the +% unit is one centimetre. which means the chits are +% $12\,\text{mm}\times12\,\text{mm}$ --- or roughly $1/2"\times1/2"$, +% which is a fairly good size for most games. +% +% \begin{figure}[tbp] +% \centering +% \begin{tikzpicture} +% \hex +% \firstchit(hex cs:r=0,c=0) +% \hex(c=1,r=0) +% \secondchit(hex cs:r=0,c=1) +% \hex(c=2,r=0) +% \thirdchit(hex cs:r=0,c=2) +% \end{tikzpicture} +% \caption{Example of chits fit within hexes. } +% \label{fig:chit:hex} +% \end{figure} +% +% \subsection{Styling chits} +% +% Typical \TikZ{} options can be passed to the \cs{chit} macro. For +% example, if you want to draw the chit with a red foreground, simply pass +% \spec{draw=red} in the \oarg{optional} arguments to +% \cs{chits}. Individual parts of the hexes can be styled separately. +% +% \paragraph{Important:} To set the colours of the various elements, +% +% one should use +% \begin{description} +% \item[\spec{color}=\meta{foreground and text}] Selects the +% foreground colour of lines, text, and so on, including for the +% NATO App6(C) symbol. +% \item[\spec{fill}=\meta{background}] Selects the background colour +% of the full chit. By default this is transparent. +% \item[\spec{text}=\meta{text foreground}] Selects the colour used +% for text in the chit. This overrides \spec{color} for text. +% \item[\spec{draw}=\meta{foreground}] This sets the colour for +% foreground elements, excluding text. +% \end{description} +% \TikZ{} allows one to pass a \meta{colour} as arguments for drawing +% and understands that as giving the foreground and text colours. +% However, that key is \emph{deprecated} for this library, as it does +% not properly propagate through\footnote{The colour +% \spec{pgfstrokecolor} is not modified by that.}. +% +% The styles used by the \spec{left}, \spec{right}, \spec{setup}, +% \spec{factors}, and \spec{symbol} elements are +% \spec{tikz/chit/left}, \spec{tikz/chit/right}, \spec{tikz/setup}, +% \spec{tikz/factors}, and \spec{tikz/symbol} respectively. A user can +% redefine these to change the appearance of the chits. For example, +% one could make the symbol larger by setting a different +% \spec{scale}, move the factors to the side by changing \spec{shift}, +% and so on. +% +% Pictures used by these elements are also styled by +% similar keys. For example, the picture \spec{chit/identifier} is +% styled by \spec{tikz/chit/identifier}. +% +% In addition, one can define the key \spec{tikz/every chit} to be the +% default options for all chits. +% +% \subsection{Defining preset chit types} +% +% One can conveniently pre-define some chit styles. For example, +% given the style definition +% +% \begin{verbatim} +% \tikzset{ +% my chit/.style={/chit/symbol={[ +% faction=friendly, +% command=land, +% main=armoured]}, +% /chit/left={chit/identifier={Mine}}, +% /chit/factors={chit/2 factors={2,4}}}} +% \end{verbatim} +% +% We can use that to make different chits with some commonalities +% defined by that style. For example +% +% \begin{tikzpicture} +% \chit[my chit](0,-2) +% \chit[my chit,color=white,fill=red,right={chit/identifier=1}](2,-2) +% \end{tikzpicture} +% +% where, in the second example, we have passed additional options to +% \cs{chit}. Note that we \emph{must} give the full path to the +% \spec{chit} keys when defining a style like this. +% +% \iffalse +% -------------------------------------------------------------------- +% +% NATO App6(c) symbols +% +% -------------------------------------------------------------------- +% \fi +% +% \cleardoublepage +% \section{NATO App 6(c) symbols} +% \label{sec:nateoapp6c} +% +% The NATO markers are designed to fit within the template shown in +% \figurename~\ref{fig:natoapp:template}. The template is serves as a +% placement guide of the the various parts of the NATO marker as +% illustrated in \figurename{fig:natoapp:usage}. +% +% \begin{figure}[htbp] +% \centering +% \begin{tikzpicture}[scale=2] +% \node[natoapp6c={command=base}] {}; +% \end{tikzpicture} +% \caption{Template for NATO symbols} +% \label{fig:natoapp:template} +% \end{figure} +% +% \begin{MacroSyntax}{\natoapp} +% \cs{natoapp}\oarg{key-value-pairs}\parg{location}\parg{name} +% \end{MacroSyntax} +% +% where all arguments are optional. +% Keys are defined to fill in the various parts of the markers. These +% keys are +% \begin{description} +% \item[\keyval{faction}{\meta{faction}}] Selects the faction used for +% the symbol. See also +% \sectionname~\ref{sec:natoapp:faction:command}. +% \item[\keyval{command}{\meta{command}}] Selects the command used for +% the symbol. See also +% \sectionname~\ref{sec:natoapp:faction:command}. +% \item[\keyval{main}{\meta{mains}}] Specifies the main symbol(s). +% This can be a comma separated list of specifiers (delimited by +% braces \marg{first,second,\textellipsis}), and each symbol can be +% preceeded by an optional argument to shift, scale, rotate, etc., +% the individual symbols. \ifShowSymbols See also +% \sectionname~\ref{sec:natoapp:mains}\fi. +% \item[\keyval{left}{\meta{lefts}}, \keyval{right}{\meta{rights}}, +% \keyval{top}{\meta{tops}}, \keyval{bottom}{\meta{bottoms}}, +% \keyval{below}{\meta{belows}}] Specifies the left-, right-hand, +% top, bottom, and lower symbol(s). The format of the arguments +% \meta{lefts}, \meta{rights}, \meta{tops}, \meta{bottoms}, and +% \meta{belows} has the same format as \meta{mains}. +% \end{description} +% +% \begin{figure}[htbp] +% \begin{tabular}{m{.45\linewidth}m{.45\linewidth}} +% \begin{center} +% \begin{tikzpicture}[scale=2] +% \natoapp[ +% faction=none, +% command=base, +% echelon=army, +% main={text=M}, +% top={text=T}, +% bottom={text=B}, +% left={text=L}, +% right={text=R}, +% below={text=V}] +% \pic[draw,transform shape]{wg/x axis={-.5,.5,-.7,,}}; +% \pic[draw,transform shape]{wg/y axis={.7,-.62,.74,,{-.5,.5,-.2,.2}}}; +% \end{tikzpicture} +% \end{center} +% & The figure is typeset by +% \begin{verbatim} +% \natoapp[faction=none, +% command=base, +% echelon=army, +% main={text=M}, +% top={text=T}, +% bottom={text=B}, +% left={text=L}, +% right={text=R}, +% below={text=V}] +% \end{verbatim} +% \end{tabular} +% \caption{Main keys of \cs{natoapp}. The bottom and right hand +% bars indicate one unit of length.} +% \label{fig:natoapp:usage} +% \end{figure} +% +% Other keys are available to further customise the appearance of the +% symbols +% +% \begin{description} +% \item[\keyval{echelon}{\meta{size}}] The size of the unit described. +% Possible values are \spec{team}, \spec{squad}, \spec{section}, +% \spec{platoon}, \spec{company}, \spec{battalion}, \spec{regiment}, +% \spec{brigade}, \spec{division}, \spec{corps}, \spec{army}, +% \spec{army group}, \spec{theatre}, and \spec{command}. +% \item[\keyval{frame}{\meta{keys}}] Extra keys for frame. +% \end{description} +% +% \subsection{Faction and Command Selection} +% \label{sec:natoapp:faction:command} +% +% Table~\ref{tab:frames} shows the various bases used for the various +% {\ttfamily{\itshape faction}/{\itshape command}} combinations. Also +% shown in the table is the base template for main identifiers. +% +% \makeatletter +% \def\tabledata{} +% \foreach \c in {air,land,equipment,installation,sea surface,sub surface,space,activity}{% +% \protected@xappto\tabledata{\spec{\c}} +% \foreach \f in {friendly,hostile,neutral,unknown}{% +% \protected@xappto\tabledata{ +% &\noexpand\tikz[scale=.8]{% +% \noexpand\path (-.75,-.75) rectangle (.75,.75); +% \noexpand\node[natoapp6c={faction=\f,command=\c},fill=\f]{}; +% \noexpand\node[natoapp6c={command=base},draw=lightgray]{}; +% }}} +% \protected@xappto\tabledata{\\ \noexpand\hline}} +% \makeatother +% +% \begin{table}[htbp] +% \centering +% \begin{tabular}{|l|m{2cm}m{2cm}m{2cm}m{2cm}|} +% \hline +% \rowcolor{headbg} +% & \multicolumn{4}{c|}{{\color{headfg}\meta{faction}}}\\ +% \rowcolor{headbg} +% {\color{headfg}\meta{command}} +% & {\color{headfg}\spec{friendly}} +% & {\color{headfg}\spec{hostile}} +% & {\color{headfg}\spec{neutral}} +% & {\color{headfg}\spec{unknown}} +% \\ +% \hline +% \tabledata +% \end{tabular} +% \caption{Frames for various combinations of \meta{faction} and +% \meta{command} combinations. These are drawn with the +% \spec{pic} given by +% \spec{natoapp6c/\meta{faction}/\meta{command}} with the options +% \spec{draw=blue,fill=\meta{faction}}. If no \spec{fill} is +% specified, then the background will be transparent. Note, the +% template for main identifiers is also shown on top of each frame.} +% \label{tab:frames} +% \end{table} +% +% The fill color of the frame is set by the key \spec{frame}. If +% this is or contains the special value \spec{faction}, then the +% frame fill colour will be the standard for the faction as +% illustrated in figure~\ref{fig:faction:color}. +% +% \begin{figure}[htbp] +% \centering +% \begin{tikzpicture} +% \foreach[count=\i] \f in {friendly,hostile,neutral,unknown}{ +% \natoapp[frame=faction,faction=\f, +% command=space,main={infantry}](2*\i-2,0)} +% \end{tikzpicture} +% \caption{Illustration of using the special value \spec{faction} +% for the \spec{frame} key} +% \label{fig:faction:color} +% \end{figure} +% +% Elements of the frame can be controlled by the key \spec{frame}. +% \begin{description} +% \item[\keyval{frame}{\meta{keys}}] Additional keys to pass to the +% frame drawing. The special option \spec{faction} will make the +% frame be filled with the standard faction color. +% \end{description} +% +% \tablename~\ref{tab:frame:color} illustrates this. +% \begin{table}[htbp] +% \centering +% \begin{tabular}{|c|cccc|} +% \hline +% \rowcolor{headbg} +% {\color{headfg}\textbf{Example}} +% & {\color{headfg}\textbf{\spec{frame=\{color,...\}}}} +% & {\color{headfg}\textbf{\spec{frame=\{fill,...\}}}} +% & {\color{headfg}\textbf{\spec{frame=\{draw,...\}}}} +% & {\color{headfg}\textbf{\spec{frame=\{line width,...\}}}} +% \\ +% \hline +% \cellcolor{white} +% \tikz{\natoapp[main={fixed wing},command=air]} +% & +% & +% & +% & +% \\ +% \hline +% \rowcolor{altcol} +% \cellcolor{white} +% \tikz{\natoapp[main={fixed wing},command=air,color=red, +% frame={line width=2pt}]} +% & \spec{red} +% & +% & +% & \spec{thick} +% \\ +% \hline +% \cellcolor{white} +% \tikz{\natoapp[main={fixed wing},command=air, +% frame={fill=yellow,line width=.5pt}]} +% & +% & \spec{yellow} +% & +% & \spec{thin} +% \\ +% \hline +% \rowcolor{altcol} +% \cellcolor{white} +% \tikz{\natoapp[main={fixed wing},command=air,frame={blue}]} +% & +% & +% & \spec{blue} +% & +% \\ +% \hline +% \cellcolor{white} +% \tikz{\natoapp[main={fixed wing},command=air,frame={fill=pink,magenta}]} +% & +% & \spec{pink} +% & \spec{magenta} +% & +% \\ +% \hline +% \rowcolor{altcol} +% \cellcolor{white} +% \tikz{\natoapp[main={fixed wing},command=air,color=red, +% frame={fill=green,draw=blue,line width=3pt}]} +% & \spec{red} +% & \spec{green} +% & \spec{blue} +% & \spec{ultra thick} +% \\ +% \hline +% \end{tabular} +% \caption{Illustration of frame colour choices} +% \label{tab:frame:color} +% \end{table} +% +% \subsection{Unit Size (\spec{echelon})} +% +% The size of a unit a marker represents is given by the +% \spec{echelon} keyword. \tablename~\ref{tab:natoapp6c:echelon} +% shows the various markers and approximate unit sizes. +% +% \let\foo\empty +% \begin{table}[htbp] +% \centering +% \begin{tabular}{|m{1.2cm}|cr@{--}lm{.27\linewidth}m{.27\linewidth}|} +% \hline +% \rowcolor{headbg} +% {\color{headfg}\textbf{Example}} +% & {\color{headfg}\spec{echelon}} +% & \multicolumn{2}{c}{{\color{headfg}\textbf{Approx.~size}}} +% & \foo{} {\color{headfg}\textbf{Sub-units}} +% & \foo{} {\color{headfg}\textbf{Officer}} +% \\ +% \hline +% \tikz[scale=.8]{\natoapp[command=land,faction=friendly,main=infantry,echelon=team,lower=airborne]} +% & \spec{team} +% & 3 +% & 5 +% & \foo{} none +% & \foo{} Corporal or Sergeant +% \\ +% \hline +% \rowcolor{altcol} +% \tikz[scale=.8]{\natoapp[command=land,faction=friendly,main=infantry,echelon=squad]} +% & \spec{squad} +% & 5 +% & 10 +% & \foo{} 1--2 teams +% & \foo{} Sergeant +% \\ +% \hline +% \tikz[scale=.8]{\natoapp[command=land,faction=friendly,main=infantry,echelon=section]} +% & \spec{section} +% & 7 +% & 13 +% & \foo{} 2--3 teams +% & \foo{} Sergeant +% \\ +% \hline +% \rowcolor{altcol} +% \tikz[scale=.8]{\natoapp[command=land,faction=friendly,main=infantry,echelon=platoon]} +% & \spec{platoon} +% & $25$ +% & $40$ +% & \foo{} Several squads/sections +% & \foo{} Second Lieutenant +% \\ +% \hline\tikz[scale=.8]{\natoapp[command=land,faction=friendly,main=infantry,echelon=company]} +% & \spec{company} +% & $60$ +% & $250$ +% & \foo{} Several platoons +% & \foo{} Captain +% \\ +% \hline +% \rowcolor{altcol} +% \tikz[scale=.8]{\natoapp[command=land,faction=friendly,main=infantry,echelon=battalion]} +% & \spec{battalion} +% & $300$ +% & $1\,000$ +% & \foo{} 2--6 companies +% & \foo{} Lieutenant colonel +% \\ +% \hline +% \tikz[scale=.8]{\natoapp[command=land,faction=friendly,main=infantry,echelon=regiment]} +% & \spec{regiment} +% & $500$ +% & $2\,000$ +% & \foo{} 3--7 battalions +% & \foo{} Colonel +% \\ +% \hline +% \rowcolor{altcol} +% \tikz[scale=.8]{\natoapp[command=land,faction=friendly,main=infantry,echelon=brigade]} +% & \spec{brigade} +% & $2\,000$ +% & $5\,000$ +% & \foo{} Several battalions +% & \foo{} Colonel +% \\ +% \hline +% \tikz[scale=.8]{\natoapp[command=land,faction=friendly,main=infantry,echelon=division]} +% & \spec{division} +% & $10\,000$ +% & $20\,000$ +% & \foo{} Several brigades/regiments +% & \foo{} Major General +% \\ +% \hline +% \rowcolor{altcol} +% \tikz[scale=.8]{\natoapp[command=land,faction=friendly,main=infantry,echelon=corps]} +% & \spec{corps} +% & $30\,000$ +% & $60\,000$ +% & \foo{} Several divisions +% & \foo{} Lieutenant General +% \\ +% \hline +% \tikz[scale=.8]{\natoapp[command=land,faction=friendly,main=infantry,echelon=army]} +% & \spec{army} +% & \multicolumn{2}{c}{$100\,000$} +% & \foo{} Several corps (5--10 divisions) +% & \foo{} General +% \\ +% \hline +% \rowcolor{altcol} +% \tikz[scale=.8]{\natoapp[command=land,faction=friendly,main=infantry,echelon=army group]} +% & \spec{army group} +% & $120\,000$ +% & $500\,000$ +% & \foo{} Several armies +% & \foo{} Field Marshal +% \\ +% \hline +% \tikz[scale=.8]{\natoapp[command=land,faction=friendly,main=infantry,echelon=theatre]} +% & \spec{theatre} +% & \multicolumn{2}{c}{$250\,000+$} +% & \foo{} Several army groups +% & \foo{} Field Marshal +% \\ +% \hline +% \rowcolor{altcol} +% \tikz[scale=.8]{\natoapp[command=land,faction=friendly,main=infantry,echelon=command]} +% & \spec{command} +% & \multicolumn{4}{c|}{Not a unit size, but designator} +% \\ +% \hline +% \end{tabular} +% \caption{Illustration of echelon values. Approximate sizes and +% command officer titles are typical modern day United States of +% America army values and identifiers. Historically the unit +% sizes have changed, as has officer titles. Furthermore, both +% the unit sizes, names, and command officer titles may vary from +% country to country, even across command.} +% \label{tab:natoapp6c:echelon} +% \end{table} +% +% \subsection{Unit type identification} +% +% \begin{table} +% \centering% +% \def\typemark#1{% +% \tikz[scale=.3]{\natoapp[faction=friendly,command=land,#1]}} +% \def\sizemark#1{% +% \tikz[scale=.2]{\pic{natoapp6c/s/echelon=#1};}} +% \begin{tabular}{|clc|} +% \rowcolor{headbg} +% {\color{headfg}\textbf{Symbol}} +% & \multicolumn{2}{c|}{\color{headfg}\textbf{Type \& Abbreviation}} +% \\ +% \hline +% \typemark{upper=air assault} +% & Air assault +% & AA\\ +% \rowcolor{altcol} +% \typemark{upper=air defence} +% & Air defence +% & ADA\\ +% \typemark{lower=airborne} +% & Airborne +% & AB\\ +% \rowcolor{altcol} +% \typemark{lower=amphibious} +% & Amphibious +% & AM\\ +% \typemark{main=anti tank anti armour} +% & Anti tank/armoured +% & AT\\ +% \rowcolor{altcol} +% \typemark{main=armoured} +% & Armoured +% & AR\\ +% \typemark{main=chemical biological radiological nuclear} +% & Chemical biological radiological nuclear +% & CB\\ +% \rowcolor{altcol} +% \typemark{main=combined arms} +% & Combined arms +% & CAR\\ +% \typemark{main=engineer} +% & Engineer +% & ENG\\ +% \rowcolor{altcol} +% \typemark{main={[fill=pgfstrokecolor]artillery}} +% & Field artillery +% & FA\\ +% \typemark{main=infantry} +% & Infantry +% & IN\\ +% \rowcolor{altcol} +% \typemark{main={infantry,armoured}} +% & Mechanised infantry +% & M\\ +% \typemark{lower=mountain} +% & Mountaineer +% & MTN\\ +% \rowcolor{altcol} +% \typemark{upper=naval} +% & Naval +% & N\\ +% \typemark{main=reconnaissance} +% & Reconnaissance +% & REC\\ +% \rowcolor{altcol} +% \typemark{main={text=sof}} +% & Special Operations Forces +% & SOF\\ +% \hline +% \rowcolor{headbg} +% {\color{headfg}\textbf{Symbol}} +% & \multicolumn{2}{c|}{\color{headfg}\textbf{Echelon \& Abbreviation}} +% \\ +% \hline +% \sizemark{army group} +% & Army group +% & AG\\ +% \rowcolor{altcol} +% \sizemark{army} +% & Army +% & A\\ +% \sizemark{corps} +% & Corps +% & -\\ +% \rowcolor{altcol} +% \sizemark{division} +% & Division +% & D\\ +% \sizemark{brigade} +% & Brigade +% & BD\\ +% \rowcolor{altcol} +% \sizemark{regiment} +% & Regiment +% & REGT\\ +% \sizemark{battalion} +% & Battalion +% & BN\\ +% \rowcolor{altcol} +% \sizemark{company} +% & Company +% & COY\\ +% \sizemark{platoon} +% & Platoon +% & PLT\\ +% \rowcolor{altcol} +% \sizemark{section} +% & Section +% & \\ +% \sizemark{squad} +% & Squad +% & \\ +% \hline +% \end{tabular} +% \caption{Some abbreviations of unit type identifications} +% \label{tab:natoapp6c:abbr} +% \end{table} +% +% +% \ifShowSymbols +% \subsection{Symbols Available} +% \label{sec:natoapp:mains} +% +% \tablename~\ref{tab:natoapp6c:main:symbols} lists all the symbols +% defined. Note, these do \emph{not} correspond to \emph{all} the +% symbols defined in NATO APP-6(C) \cite{app6c}. However, using +% combinations of these symbols one can construct \emph{all} of +% those symbols (and so more if so desired). +% +% \ifShowCompat +% See also +% Appendix~\ref{app:natoapp6c:compat} for compatibility charts +% between this library and \textsf{milsymb} \cite{milsymb}. +% \fi +% +% {\makeatletter\SymbolTable{land}{\n@to@pp@s@ll}} +% \fi +% +% \begin{thebibliography}{99} +% \bibitem{fb} Hanover,C., Hendrix,C.E., \& Llewelyn,S., +% \textit{First Blood}, 1997, \url{https://grognard.com/fb/} +% \bibitem{app6c} \textit{NATO Joint Military Symbology}, APP-6(C), +% May 2011, +% \url{https://en.wikipedia.org/wiki/NATO_Joint_Military_Symbology}. +% \bibitem{app6d} \textit{NATO Joint Military Symbology}, APP-6(D), +% October 2017, +% \url{https://nso.nato.int/nso/nsdd/main/standards/ap-details/1912/EN} +% \bibitem{milsymb} \textsf{milsymb} package, +% \url{https://www.ctan.org/pkg/MilSymb}. +% \end{thebibliography} +% +% \StopEventually{} +% +% +% \iffalse +% ==================================================================== +% +% Implementation +% +% ==================================================================== +% +% The wargame main package +% +% -------------------------------------------------------------------- +% \fi +% +% \section{Implementation} +% \label{sec:impl} +% +% \input{package.dtx} +% \input{util/core.dtx} +% \input{hex/core.dtx} +% \input{chit/core.dtx} +% \input{natoapp6c/core.dtx} +% +% \appendix +% +% \iffalse +% ==================================================================== +% +% Appendices +% +% ==================================================================== +% +% Compat tables +% +% -------------------------------------------------------------------- +% \fi +% +% \ifShowCompat +% \section{Compatibility tables} +% \label{app:natoapp6c:compat} +% +% The following tables provides compatibility with the the +% \textsf{milsymb} package available from CTAN. +% +% \let\CompatSection\subsection +% \let\CompatSubSection\subsubsection +% \input{cmp_air} +% \input{cmp_missile} +% \input{cmp_land} +% \input{cmp_equipment} +% \input{cmp_installation} +% \input{cmp_seasurface} +% \input{cmp_subsurface} +% \input{cmp_seamine} +% \input{cmp_space} +% \input{cmp_activity} +% \fi +% +% \iffalse +% ==================================================================== +% +% Draft VASSAL module +% +% -------------------------------------------------------------------- +% \fi +% \section{Generate draft VASSAL module} +% \label{app:vassal} +% +% We can use the code you wrote for your game pieces (counters, maps, +% tables), to generate a draft VASSAL module. To that end, use the +% document class \textsf{wgexport}, and some simple macros to export +% your graphics to a single PDF. A provided Python script then +% processes this to generate the draft VASSAL module. +% +% The generated VASSAL module is not the final thing, but it is a good +% start. +% +% \subsection{Example} +% +% Suppose we have defined counters and markers like +% \begin{verbatim} +% allied 1 id axis 1 ad out of supply +% allied 2 ad axis 2 ad game turn +% allied 3 abid axis 3 ic +% \end{verbatim} +% via Tikz styles. Also assume that we have macros +% \begin{verbatim} +% \board \oob \charts \front +% \end{verbatim} +% which produces \textsf{tikzpicture}s to the board, OOBs, charts, and +% cover, respectively. All this is defined in our package +% \texttt{mygame}. Of course that we have our rules in the file +% \texttt{game.pdf}. +% +% We prepare a simple \LaTeX{} source file +% +% \begin{verbatim} +% \documentclass{wgexport} +% \usepackage{mygame} +% \begin{document} +% \begin{imagelist} %% Records image meta info +% \chitimages{{% +% {allied 1 id,allied 2 ad,allied 3 abid}/Allied,% +% {axis 1 ad,axis 2 ad,axis 3 ic}/Axis,% +% {out of supply, game turn}/Markers}} +% \info{Board}{board}{} \board +% \info{OOB}{oob}{} \oob +% \info{Charts}{chart}{}\chart +% \info{Cover}{front}{} \front +% \end{imagelist} +% \end{document} +% \end{verbatim} +% +% When we run \LaTeX{} on this, we will get a PDF where each page is a +% separate image and the page is cropped to image. \emph{In addition} +% we will get a CSV (comma-separated-values) file \texttt{export.csv} +% which contains some meta information about each page. In +% particular, it identifies the name of each page, the category, and +% sub category of the image. +% +% For chits, the name of the image is the style name (e.g., \texttt{game +% turn}). For other images, it is the first argument to \cs{info} +% above. +% +% The category is for chits is always \texttt{counter}. For other +% images, it is the second argument to the \cs{info} macro (e.g., +% \texttt{board}). +% +% The category of an image is important later on when we generate the +% VASSAL module. Recognised categories are +% +% \begin{itemize} +% \item \texttt{counter} for counter images. Such an image will +% trigger the creation of a VASSAL game piece. +% \item \texttt{board} for board images. Images of this kind will +% result in VASSAL board (or Map) elements. +% \item \texttt{oob} for Order of Battle tables. This will also +% result in a VASSAL map being created, but one that is displayed as +% a pop-up and with a rectangular grid. This is useful for placing +% units in an Order of Battle chart. +% \item \texttt{chart} for charts. These images will be made VASSAL +% charts --- i.e., pop-up windows which contains some graphics for the +% players reference. +% \item \texttt{front} for the cover image. This will become the +% module splash image. Only one such image (the first) will be used. +% \end{itemize} +% +% Other categories may be used, and the corresponding image will be +% added to the VASSAL module. However, they will no be processed in +% any specific way. +% +% The \emph{sub-category} is mainly used for counters. Above, we gave +% the sub-categories \texttt{Allied}, \texttt{Axis}, and +% \texttt{Markers}. The sub-categories will help to identify the +% factions of the game, and counter prototypes will be made for each +% category. The sub-categories of \texttt{board}, \texttt{charts}, +% \texttt{oob}, and \texttt{front} has no or little effect. +% +% One we have processed the file above to generate our PDF (Say +% \texttt{export.pdf}), then we can process it (and the CSV file) with +% a Python script to make our draft VASSAL module +% +% \begin{verbatim} +% export.py export.pdf export.csv -o Game.vmod -t Game -v 0.1 \ +% -d "My game" -r rules.pdf +% \end{verbatim} +% +% This will generate the draft module \texttt{Game.vmod}. Note that +% we add the rules (\texttt{-r rules.pdf}) to the module so that the +% module is complete. +% +% Once the module has been generated, one can open it in the VASSAL +% editor and further customise it. For example, the grids used in +% the boards needs to be adjusted, and one may want to make initial +% set-ups or add all counters to the OOB. +% +% Of course, running the Python script will overwrite all changes, so +% perhaps it is a good idea to work on a copy of the output file. +% +% \iffalse +% This is the package used by the documentation +%<*docsty> +\ProvidesPackage{wgdoc} +\DeclareOption{noterrainpic}{% + \PassOptionsToPackage{noterrainpic}{wargame}} +\ProcessOptions\relax +% +\RequirePackage{etoolbox} +\RequirePackage{wargame} +\RequirePackage{longtable} +\RequirePackage{colortbl} +\RequirePackage{hyperref} +\RequirePackage{textcomp} +\RequirePackage{float} +\RequirePackage[a4paper,right=1cm,left=2cm]{geometry} +% +\usetikzlibrary{external} +\tikzexternalize[mode=graphics if exists,prefix=.cache-] +% +\newcommand\TikZ{{\mdseries Ti{\itshape k}Z}} +\newcommand\sectionname{Section} +\let\subsubsubsection\paragraph +% +\colorlet{headbg}{LightSlateGrey!50} +\colorlet{headfg}{black} +\colorlet{altcol}{LightSteelBlue!50} +\newcommand\spec[1]{{\obeyspaces\ttfamily #1}} +\newcommand\tspec[1]{{\ttfamily\footnotesize\obeyspaces #1}} +\newcommand\keyval[2]{\spec{#1}=#2} +% +\setlength{\parindent}{0pt} +\setlength{\parskip}{1ex} +\setlength\hfuzz{15pt} +\hbadness=7000 +% +\tikzset{ + cc name/.pic={ + \draw[fill=pgfstrokecolor,draw=none,even odd rule] + (0,0) circle(.5) circle(.41) + node[fill=none,transform shape, + font=\sffamily\bfseries\fontsize{16}{0}\selectfont] {cc} + ; + }, + cc by/.pic={ + \draw[fill=pgfstrokecolor,draw=none,even odd rule] + (0,0) circle(.5) circle(.41) (0,.26) circle(.07) + (0,.15) + --++(.11,0) + to[bend left] ++(.02,-.02) + --++(0,-.20) + --++(-.05,0) + --++(0,-.25) + --++(-.15,0) + --++(0,.25) + --++(-.05,0) + --++(0,.2) + to[bend left] ++(.02,.02) + --cycle + ; + }, + cc sa/.pic={ + \draw[fill=pgfstrokecolor,draw=none,even odd rule] + (0,0) circle(.5) circle(.41) + (-.22,-.08) + to[bend right=40] ++(.23,-.20) + to[bend right=40] ++(.23, .20) + to[bend right=10] ++(0, .16) + to[bend right=40] ++(-.23, .20) + to[bend right=40] ++(-.23, -.20) + --++(-.05,0) + --++(-45:.15) + --++( 45:.15) + --++(-.05,0) + to[bend left=40] ++(.12, .1) + to[bend left=40] ++(.12, -.1) + to[bend left=10] ++(0, -.16) + to[bend left=40] ++(-.12, -.1) + to[bend left=40] ++(-.12, .1) + --cycle + ; + }, + cc by sa/.pic={ + \pic at(-1,0) {cc name}; + \pic at( 0,0) {cc by}; + \pic at( 1,0) {cc sa}; + } +} + +% +\newcommand\Continued[1]{\multicolumn{#1}{c}{% + \textit{\small continued from previous page}}\\} +\newcommand\Continues[1]{\multicolumn{#1}{c}{% + \textit{\small continues on next page}}\\} +\newcommand\SymbolTable[3][]{% + \setlength{\LTcapwidth}{\linewidth} + \def\tabledata{} + \foreach \m in #3{% + \protected@xappto\tabledata{\spec{\m}} + \foreach \f in {friendly,hostile,neutral,unknown}{% + \protected@xappto\tabledata{ + &\noexpand\tikz[scale=.8]{% + \noexpand\natoapp[faction=\f,% + command=#2,% + main={\m},% + frame={faction},% + #1]}}} + \protected@xappto\tabledata{\\ \noexpand\hline}} + \def\colheaders{% + \hline% + & \multicolumn{4}{c|}{\meta{faction}}\\% + \meta{symbol}% + & \spec{friendly}% + & \spec{hostile}% + & \spec{neutral}% + & \spec{unknown}% + \\% + \hline} + \begin{longtable}{|l| + m{.1\linewidth} + m{.1\linewidth} + m{.1\linewidth} + m{.1\linewidth}|} + \caption{Symbols\label{tab:natoapp6c:main:symbols}}\\ + \colheaders + \endfirsthead + \Continued{5} + \colheaders + \endhead + \Continues{5} + \endfoot + \endlastfoot + \tabledata + \end{longtable} +} +% +\def\CompatSection#1{} +\def\CompatSubSection#1{} +\newcommand\CompatTable[3]{% command, where, list + \CompatSubSection{\spec{#2}} + \setlength{\LTcapwidth}{\linewidth} + \def\tabledata{} + \foreach \m/\s in #3{% + \n@to@pp@dbg{2}{Compatibility: `\m' -> `\s'} + \protected@xappto\tabledata{\tspec{\m} & \tspec{\s}} + \foreach \f in {{none,frame={draw=lightgray}},% + friendly,hostile,neutral,unknown}{% + \protected@xappto\tabledata{ + &\noexpand\tikz[scale=.5]{% + \noexpand\natoapp[faction=\f,command=#1,\s,frame={faction}]}}} + \protected@xappto\tabledata{\\ \noexpand\hline}} + \def\colheaders{% + \hline% + & + & \multicolumn{5}{c|}{\meta{faction}}\\% + \textsf{milsymb}% + &\textsf{wargame}% + & \spec{none}% + & \spec{friendly}% + & \spec{hostile}% + & \spec{neutral}% + & \spec{unknown}% + \\% + \hline} + \begin{longtable}{| + m{.15\linewidth}| + m{.20\linewidth}| + m{.08\linewidth} + m{.08\linewidth} + m{.08\linewidth} + m{.08\linewidth} + m{.08\linewidth}|} + \caption{Compatibility with \textsf{milsymb} \spec{#1},\spec{#2} + symbols\label{tab:compat:#1:#2}}\\ + \colheaders + \endfirsthead + \Continues{7} + \colheaders + \endhead + \Continues{7} + \endfoot + \endlastfoot + \tabledata + \end{longtable} +} +% +\newenvironment{Syntax}{% + \par + \vspace{1ex} + \hspace*{-1cm} + \ttfamily + \begin{tabular}{|>{\columncolor{altcol}}p{.8\textwidth}|} + \hline}{\\\hline\end{tabular}\par\vskip 1ex} +\def\MacroSyntax{% + \leavevmode\begingroup% + %\catcode`\\12 + \MakePrivateLetters\M@croSyntax} +\def\M@croSyntax#1{\endgroup% + \foreach \k in {#1}{\expandafter\Special@Usage@Index\k} + \Syntax} +\let\endMacroSyntax\endSyntax +% +\@ifundefined{SpecialIndex@}{ + \gdef\SpecialIndex@#1#2{% + \@SpecialIndexHelper@#1\@nil + \def\@tempb{ }% + \ifcat \@tempb\@gtempa + \special@index{\quotechar\space\actualchar + \string\verb\quotechar*\verbatimchar + \quotechar\bslash\quotechar\space\verbatimchar#2}% + \else + \def\@tempb##1##2\relax{\ifx\relax##2\relax + \def\@tempc{\special@index{\quotechar##1\actualchar + \string\verb\quotechar*\verbatimchar + \quotechar\bslash\quotechar##1\verbatimchar#2}}% + \else + \def\@tempc{\special@index{##1##2\actualchar + \string\verb\quotechar*\verbatimchar + \bslash##1##2\verbatimchar#2}}% + \fi}% + \expandafter\@tempb\@gtempa\relax + \@tempc + \fi}}{} +% +\def\Special@Usage@Index#1{\@bsphack + {\let\special@index\index\SpecialIndex@{#1}{}}% + \@esphack} +% +\def\Speci@lIndex#1#2#3#4{% + \@bsphack\special@index{% + #1\actualchar + {\string\ttfamily\space#1} + (#3)% + \encapchar main}% + \special@index{#4:\levelchar#2\actualchar{% + \string\ttfamily\space#2}\encapchar main}\@esphack} +% +\def\SpecialHexKeyIndex#1#2{\Speci@lIndex{#1}{#2}{key}{Hex keys}} +\def\SpecialNatoSymbolIndex#1#2{% + \Speci@lIndex{#1}{#2}{symbol}{NATO App6(c) symbols}} +\def\SpecialNatoFrameIndex#1#2{\Speci@lIndex{#1}{#2}{frame}{NATO App6(c) frame}} +\def\SpecialNatoKeyIndex#1#2{\Speci@lIndex{#1}{#2}{key}{NATO App6(c) keys}} +\def\SpecialKeyIndex#1{\Speci@lIndex{#1}{#1}{key}{TikZ keys}} +% +\def\get@third #1/#2/#3/{\gdef\curr@third{#3}} +\def\get@second #1/#2/#3/{\gdef\curr@second{#2}} +% +\def\KeyT@ble#1#2{ + \leavevmode + \par + \vspace{1ex} + \hspace*{-1cm} + \begin{tabular}{#1} + \hline + #2 + \hline + \end{tabular}\par} +% +\def\ShowKeyT@ble#1{ + \KeyT@ble{|p{.1\textwidth}|>{\columncolor{altcol}}p{.7\textwidth}|}{#1}} +% +\def\Macro{% + \begingroup% + \catcode`\\12 + \MakePrivateLetters\M@cro} +% +\def\M@cro#1{% + \endgroup + \def\tabledata{} + \foreach \k in {#1}{% + \protected@xappto\tabledata{% + \noexpand\spec{\noexpand\string\k}\noexpand\SpecialMainIndex{\k}\\}} + \KeyT@ble{|>{\columncolor{altcol}}p{.8\textwidth}|}{\noexpand\tabledata}} +\def\endMacro{} +% +\newenvironment{NatoAppSymbol}[1]{% + \def\tabledata{} + \foreach \k in {#1}{% + \expandafter\get@third\k/ + \protected@xappto\tabledata{% + \noexpand\tikz[scale=.5]{\noexpand\natoapp[main=\curr@third, + faction=none,command=base,frame={draw=lightgray}]} + &\noexpand\spec{\k} + \noexpand\SpecialNatoSymbolIndex{\k}{\curr@third}\\}} + \ShowKeyT@ble{\tabledata}}{} +\newenvironment{NatoAppFrame}[1]{% + \def\tabledata{} + \foreach \k in {#1}{% + %\expandafter\get@third\k/ + %\expandafter\get@second\k/ + \protected@xappto\tabledata{% + \noexpand\tikz[scale=.5]{\noexpand\node[shape=\k] {};} + &\noexpand\spec{\k} + \noexpand\SpecialNatoFrameIndex{\k}{\k}\\}} + \ShowKeyT@ble{\tabledata}}{} +\newenvironment{NatoAppKey}[1]{% + \def\tabledata{} + \foreach \k in {#1}{% + \expandafter\get@second\k// + \protected@xappto\tabledata{% + \noexpand\spec{\k}\noexpand\SpecialNatoKeyIndex{\k}{\curr@second}\\}} + \KeyT@ble{|>{\columncolor{altcol}}p{.8\textwidth}|}{\tabledata}}{} +% +\newenvironment{HexKey}[1]{% + \def\tabledata{} + \foreach \k in {#1}{% + \expandafter\get@second\k// + \protected@xappto\tabledata{% + \noexpand\spec{\k}\noexpand\SpecialHexKeyIndex{\k}{\curr@second}\\}} + \KeyT@ble{|>{\columncolor{altcol}}p{.8\textwidth}|}{\tabledata}}{} +\newenvironment{HexKey*}[1]{% + \def\tabledata{} + \foreach \k in {#1}{% + \expandafter\get@second\k/ + \expandafter\get@third\k/ + \protected@xappto\tabledata{% + \noexpand\spec{\k}\noexpand\SpecialHexKeyIndex{\k}{\curr@second/\curr@third}\\}} + \KeyT@ble{|>{\columncolor{altcol}}p{.8\textwidth}|}{\tabledata}}{} +% +\newenvironment{TikzKey}[1]{% + \def\tabledata{} + \foreach \k in {#1}{% + \protected@xappto\tabledata{% + \noexpand\spec{\k}\noexpand\SpecialKeyIndex{\k}\\}} + \KeyT@ble{|>{\columncolor{altcol}}p{.8\textwidth}|}{\tabledata}}{} +% +\tikzset{ + pics/wg/x axis/.style args={#1,#2,#3,#4,#5}{ + code={ + \begin{scope}[/pgf/number format/.cd,fixed,precision=2] + \path[pic actions] (#1,#3)--(#2,#3) + \foreach \t in {#1,#2,#4}{ + \ifx\t\@empty\else + (\t,#3)--++(0,-.2) + node[anchor=north]{$\pgfmathprintnumber{\t}$}\fi} + \foreach \t in {#5}{ + \ifx\t\@empty\else + (\t,#3)--++(0,-.1) + node[anchor=north,font=\small]{$\pgfmathprintnumber{\t}$}\fi}; + \end{scope}}}, + pics/wg/y axis/.style args={#1,#2,#3,#4,#5}{ + code={ + \begin{scope}[/pgf/number format/.cd,fixed,precision=2] + \path[pic actions] (#1,#2)--(#1,#3) + \foreach \t in {#2,#3,#4}{ + \ifx\t\@empty\else + (#1,\t)--++(.2,0) + node[anchor=west]{$\pgfmathprintnumber{\t}$}\fi} + \foreach \t in {#5}{ + \ifx\t\@empty\else + (#1,\t)--++(.1,0) + node[anchor=west,font=\small]{$\pgfmathprintnumber{\t}$}\fi}; + \end{scope}}}, + pics/wg/xaxis/.style args={#1,#2,#3,#4}{% + code={ + \pic[draw]{wg/x axis={-#1,#1,#2,#3,#4}};}}, + pics/wg/yaxis/.style args={#1,#2,#3,#4}{% + code={ + \pic[draw]{wg/y axis={#1,-#2,#2,#3,#4}};}}, +} +%</docsty> +% +% \iffalse +% -------------------------------------------------------------------- +% +% Symbols documentation driver +% +% -------------------------------------------------------------------- +% \fi +% +% Driver for symbols only document +%<*symbols> +\title{The \textsf{wargame} package\\ + Symbols} +\author{Christian Holm Christensen} +\date{\today} +\begin{document} +\maketitle +% \natoappdbglvl=3 +{\makeatletter\SymbolTable{land}{\n@to@pp@s@ll}} +\end{document} +%</symbols> +% +% +% +% +% +% \iffalse +% -------------------------------------------------------------------- +% +% Compatibility documentation driver +% +% -------------------------------------------------------------------- +% \fi +% +% +%<*compat> +% Driver for compatibility only document +\title{The \textsf{wargame} package\\ + \textsf{milsymb} Compatibility} +\author{Christian Holm Christensen} +\date{\today} +\begin{document} +\newgeometry{margin=1cm} +\maketitle +% \natoappdbglvl=1 +\let\CompatSection\section +\let\CompatSubSection\subsection +\input{cmp_air} +\input{cmp_missile} +\input{cmp_land} +\input{cmp_equipment} +\input{cmp_installation} +\input{cmp_seasurface} +\input{cmp_subsurface} +\input{cmp_seamine} +\input{cmp_space} +\input{cmp_activity} +\restoregeometry +\end{document} +%</compat> +% \fi +% +% \PrintIndex +% \Finale +% +% +% +% \iffalse +% EOF +% Local Variables: +% TeX-command-extra-options: "-shell-escape" +% End: +% \fi diff --git a/macros/latex/contrib/wargame/source/wargame.ins b/macros/latex/contrib/wargame/source/wargame.ins new file mode 100644 index 0000000000..0ab9ec5a74 --- /dev/null +++ b/macros/latex/contrib/wargame/source/wargame.ins @@ -0,0 +1,176 @@ +%% This is file `wargame.ins', the installation file for the +%% `wargame' package. +%% +%% Copyright (C) 2019 Christian Holm. +%% +%% The wargame package is free software; you can redistribute it +%% and/or modify it under the terms of the GNU General Public License +%% as published by the Free Software Foundation; either version 2 of +%% the License, or (at your option) any later version. +%% +%% The universal package is distributed in the hope that it will be +%% useful, but WITHOUT ANY WARRANTY; without even the implied warranty +%% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +%% GNU General Public License for more details. +%% +%% You should have received a copy of the GNU General Public License +%% along with this package; if not, write to the Free Software +%% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +%% + +\input docstrip.tex +\keepsilent +\askforoverwritefalse +\declarepreamble\long + +Copyright (C) 2019 Christian Holm. + +This file is NOT the source for wargame, because almost all comments +have been stripped from it. It is NOT the preferred form of universal +for making modifications to it. + +Therefore you can NOT redistribute and/or modify THIS file. You can +however redistribute the complete source (wargame.dtx and wargame.ins) +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2, or (at +your option) any later version. + +The wargame package is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public +License along with this package; if not, write to the + Free Software Foundation, Inc., + 675 Mass Ave, Cambridge, + MA 02139, USA. + +See the file wargame.dtx for further comments and documentation. + +\endpreamble + +\declarepreamble\short + +Copyright (C) 2019 Christian Holm. + +The wargame package is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +See the file wargame.dtx for further comments and documentation. + +\endpreamble + +\postamble +Local Variables: + mode: LaTeX +End: +\endpostamble + +\usepreamble\long +\usedir{tex/latex/wargame} +\Msg{***********************************************************} +\Msg{* Generating LaTeX files} +\Msg{***********************************************************} +\generate{% + \file{wargame.sty} {\from{package.dtx}{package}} + \file{wgdoc.sty} {\from{wargame.dtx}{docsty}} + \file{compat.tex} {\from{wargame.dtx}{driver,compat}} + \file{symbols.tex} {\from{wargame.dtx}{driver,symbols}} + % + \file{tikzlibrarywargame.util.code.tex}{% + \from{util/core.dtx}{utils}} + % + \file{wgexport.cls}{% + \from{util/core.dtx}{exportcls}} + % + \file{tikzlibrarywargame.hex.code.tex}{ + \from{hex/core.dtx} {hex} + \from{hex/coord.dtx} {hex} + \from{hex/shape.dtx} {hex} + \from{hex/terrain.dtx} {hex} + \from{hex/terrain/beach.dtx} {hex} + \from{hex/terrain/light_woods.dtx}{hex} + \from{hex/terrain/woods.dtx} {hex} + \from{hex/terrain/swamp.dtx} {hex} + \from{hex/terrain/rough.dtx} {hex} + \from{hex/terrain/mountains.dtx} {hex} + \from{hex/terrain/village.dtx} {hex} + \from{hex/terrain/town.dtx} {hex} + \from{hex/terrain/city.dtx} {hex} + \from{hex/terrain/mountain.dtx} {hex} + \from{hex/terrain/tree.dtx} {hex} + \from{hex/ridges.dtx} {hex} + \from{hex/towns.dtx} {hex} + \from{hex/labels.dtx} {hex} + \from{hex/extra.dtx} {hex} + \from{hex/paths.dtx} {hex} + \from{hex/board.dtx} {hex}} + % + \file{tikzlibrarywargame.natoapp6c.code.tex}{ + \from{natoapp6c/core.dtx} {natoapp6c} + \from{natoapp6c/frames/base.dtx} {natoapp6c} + \from{natoapp6c/frames/friendly.dtx}{natoapp6c} + \from{natoapp6c/frames/hostile.dtx} {natoapp6c} + \from{natoapp6c/frames/neutral.dtx} {natoapp6c} + \from{natoapp6c/frames/unknown.dtx} {natoapp6c} + \from{natoapp6c/echelon.dtx} {natoapp6c} + \from{natoapp6c/text.dtx} {natoapp6c} + \from{natoapp6c/shape.dtx} {natoapp6c} + \from{natoapp6c/util.dtx} {natoapp6c} + \from{natoapp6c/weaponry.dtx} {natoapp6c} + \from{natoapp6c/symbols.dtx} {natoapp6c} + \from{natoapp6c/list.dtx} {natoapp6c}} + % + \file{tikzlibrarywargame.chit.code.tex}{ + \from{chit/core.dtx} {chit} + \from{chit/shape.dtx} {chit} + \from{chit/elements.dtx}{chit} + \from{chit/misc.dtx} {chit}} + % + \file{beach.tex} {\from{hex/tile.dtx}{tile,beach}} + \file{city.tex} {\from{hex/tile.dtx}{tile,city}} + \file{light_woods.tex}{\from{hex/tile.dtx}{tile,lightwoods}} + \file{mountains.tex} {\from{hex/tile.dtx}{tile,mountains}} + \file{rough.tex} {\from{hex/tile.dtx}{tile,rough}} + \file{swamp.tex} {\from{hex/tile.dtx}{tile,swamp}} + \file{town.tex} {\from{hex/tile.dtx}{tile,town}} + \file{village.tex} {\from{hex/tile.dtx}{tile,village}} + \file{woods.tex} {\from{hex/tile.dtx}{tile,woods}} + % + \file{testmap.tex} {\from{tests/map.dtx}{testmap}} + \file{testchits.tex} {\from{tests/chits.dtx}{testchits}} + % + \file{cmp_air.tex} {\from{natoapp6c/compat/air.dtx} {cmp}} + \file{cmp_missile.tex} {\from{natoapp6c/compat/missile.dtx} {cmp}} + \file{cmp_land.tex} {\from{natoapp6c/compat/land.dtx} {cmp}} + \file{cmp_equipment.tex} {\from{natoapp6c/compat/equipment.dtx} {cmp}} + \file{cmp_installation.tex}{\from{natoapp6c/compat/installation.dtx}{cmp}} + \file{cmp_seasurface.tex} {\from{natoapp6c/compat/seasurface.dtx} {cmp}} + \file{cmp_subsurface.tex} {\from{natoapp6c/compat/subsurface.dtx} {cmp}} + \file{cmp_seamine.tex} {\from{natoapp6c/compat/seamine.dtx} {cmp}} + \file{cmp_space.tex} {\from{natoapp6c/compat/space.dtx} {cmp}} + \file{cmp_activity.tex} {\from{natoapp6c/compat/activity.dtx} {cmp}} + % +} + +\Msg{***********************************************************} +\Msg{* To finish the installation you have to move the files} +\Msg{* `wargame.sty' `*.code.tex' into a directory searched by TeX.} +\Msg{*} +\Msg{* To produce the documentation do:} +\Msg{*\space\space latex wargame.dtx} +\Msg{*\space\space latex wargame.dtx} +\Msg{*\space\space makeindex -s gind -o wargame.ind wargame.idx} +\Msg{*\space\space makeindex -s gglo -o wargame.gls wargame.glo} +\Msg{*\space\space latex wargame.dtx} +\Msg{*\space\space latex wargame.dtx} +\Msg{* or whatever appropiate for your system.} +\Msg{***********************************************************} +\endbatchfile + +%% Local Variables: +%% mode: docTeX +%% End:
\ No newline at end of file |