% \section{VASSAL module} % \label{sec:vassal} % % As already mentioned several times in this tutorial, we can use the % definitions of maps, counters, and charts to generate a VASSAL % module. % % \begin{quote} % VASSAL\footnote{\url{https://vassalengine.org}} is a % cross-platform\footnote{It is written in Java, meaning it runs % almost everywhere, except on iOS and Android} tool for playing % wargames against other humans or solitaire. One can do % Play-By-E-Mail (PBEM) or online. % \end{quote} % % The trick is to prepare a separate \LaTeX{} document, say % \texttt{export.tex} as in this tutorial, which exports the images as % single pages. Then, the Python script \texttt{wgexport.py} % distributed with the \textsf{wargame} package picks up this output % (\texttt{export.pdf} and \texttt{export.json}) and generates a draft % VASSAL module. % % In addition, you can supply a Python script, say \texttt{patch.py}, % which will be run on the draft module so that you fix things up in % the VASSAL module. In this way, your VASSAL module will likely need % very little hand editing (if at all), and will be robust against % changes in the \LaTeX{} code\footnote{Assuming you keep your Python % \texttt{patch.py} script up to date.}. This of course requires a % bit of familiarity with Python, which is time well spent. % % Let us get into it. % % \subsection{The \texttt{export.tex} file}. % \label{sec:export:tex} % % This file will output all the images to a PDF, % \meta{export}\texttt{.pdf} along with meta information to a % JSON\footnote{JavaScript Object Notation} file % \meta{export}\texttt{.json}. This is relatively simple to do. % % We need to use the document class \texttt{wgexport}, so lets go a % head and load that. % % \begin{macrocode} \documentclass[11pt]{wgexport} % \end{macrocode} % % Make sure you give the right font size as argument. % % This is where it pays off that we put all our definitions of % counters, board, charts, etc. into a separate package. To import % these, we simply use that package here\footnote{If we hadn't made % that package, we would have to repeat the definitions in some % way. Very error prone}. So we load the package and start our % document. % % \begin{macrocode} \usepackage{game} \begin{document} % \end{macrocode} % % Now the body of the document will simply consist of a list of % images, one for each side of each counter, the board, charts, and so % on. We need to put everything into the environment % \texttt{imagelist} which will keep track of our meta data. % % \begin{macrocode} \begin{imagelist} % \end{macrocode} % % So far so good. The first thing we will output are the counters. % For that we will use the macro \verb+\doublechitimages+ (if we had % single sided counters, we would use \verb+\chitimages+). This macro % takes two arguments: The list of counter definitions and the faction % of the chits. Let's go ahead and make those for factions A and B, % and the special faction ``Markers'' which will only be the game turn % counter. % % \begin{macrocode} \doublechitimages[A][chit drop shadows]{\alla} \doublechitimages[B][chit drop shadows]{\allb} \doublechitimages[Markers][chit drop shadows]{{game turn chit}} % \end{macrocode} % % Again, the macros we made for the counters comes in handy. Note % that we have used it twice so far: For the OOBs and here for the % VASSAL module. We will, in fact, use them one more time to create % the counter sheet. % % To automatically make ``battle markers'' --- markers that identify % individual battles by placing a numbered marker on top of the % combatants, we can use the macro \verb+battlemarkers+. It takes one % argument, which is the number of unique markers to make and add. % The markers are round yellow circles with a number in % them\footnote{This can of course be customised as everything else % can.}. % % \begin{macrocode} \tikzset{} \battlemarkers[marker drop shadows]{12} \tikzset{every battle marker/.style={}} % \end{macrocode} % % Furthermore, we can add ``odds'' and battle result markers. Odds % markers can be placed via the battle markers context menu, and then % later be replaced by result markers via the context menu of the odds % markers. This is done via the macros \verb+\oddsmarkers+ and % \verb+\resultmarkers+. Both macros accept a list of options (odds % and results, respectively) with a possible background colour to use % in the markers. % % \begin{macrocode} \oddsmarkers[marker drop shadows]{% 1:3/red!25!white,% 1:2/red!15!white,% 1:1/orange!15!white,% 2:1/white,% 3:1/green!15!white,% 4:1/green!25!white} \resultmarkers[marker drop shadows]{ AE/red!50!white, AR/red!25!white, EX/white, DR/green!10!white, DE/green!25!white} % \end{macrocode} % % By default, odds markers must be placed ``by-hand'', but via the % VASSAL preferences it is possible to calculate the odds and show % them when the battle is declared. By default, this calculation will % only be concerned with the combat factors of the involved units, and % features such as terrain is ignored. However, with a bit of Python % skill, one can flesh out the implementation of the game rules in the % optional patch (Python) script. We will not do that here, as a it % is a little beyond the scope of this tutorial. % % Right, so that made our counter images and the associated meta % data. Next thing is to add our board. For that, we use the % environment \texttt{boardimage}. Inside that environment we must % draw the board. The environment takes one optional argument which % classifies the board. Meaningful classifications are \texttt{board} % (default) and \texttt{oob} for OOBs. The first mandatory argument % is the name of the board (more or less free form text, except any of % ``\texttt{./\textbackslash '"}'' should not be used. The second % mandatory argument is a sub-category, and is mainly reserved for % future use. % % \begin{macrocode} \begin{boardimage}{Board}{} \begin{board} \end{board} \end{boardimage} % \end{macrocode} % % We will make another board image for our OOB, since that component % should hold counters in VASSAL. We pass the optional argument % \texttt{oob} in this case. % % \begin{macrocode} \begin{boardimage}[oob]{OOB}{}% \fulloob \end{boardimage} % \end{macrocode} % % We have two charts that we would also like to be put in: The CRT and % the TEC. These \emph{must} be put into \Tikz{} pictures, and we % precede those with the macro \verb+\info+. This macro takes three % arguments: The name of the next image, the category, and % sub-category. Again, the name is more or less free form, and the % category in some sense dictates how it will present in the VASSAL % module. For charts we should use the category \texttt{chart}. The % sub-category isn't really used at this point. % % \begin{macrocode} \info{CRT}{chart}{} \begin{tikzpicture} \node{\crt}; \end{tikzpicture} % \info{TEC}{chart}{} \begin{tikzpicture} \node{\tec}; \end{tikzpicture} % \end{macrocode} % % We also want background images for our pools of eliminated units in % VASSAL. This will be enlarged version of main headquarter unit of % each faction, overlayed with a white semi-transparent background. % % \begin{macrocode} \info{A}{pool}{} \begin{tikzpicture}[scale=7] \chit[a hq]; \fill[white,opacity=.5](-.6,-.6)rectangle++(1.2,1.2); \end{tikzpicture} \info{B}{pool}{} \begin{tikzpicture}[scale=7] \chit[b hq]; \fill[white,opacity=.5](-.6,-.6)rectangle++(1.2,1.2); \end{tikzpicture} % \end{macrocode} % % We can add splash page image. We have not defined such an image in % the \texttt{game} package, but we could have, so we will make it % here. Again, it should be a \Tikz{} picture. For this, we need to % use the category \texttt{front}. % % \begin{macrocode} \info{Splash}{front}{} \begin{tikzpicture} \node[board frame,title, minimum width=5cm,minimum height=5cm] {A Game}; \end{tikzpicture} % \end{macrocode} % % We could continue to add more if we wanted to. Basically anything % can be added. For example, one might want custom button icons or % the like. We will add a few such icons here, mainly to show how % the \texttt{patch.py} script works. % % The \textsf{wgexport.cls} class provides a number of icons we may % use for this. These are % % \begin{center} % \begin{tikzpicture} % \pic {flip icon}; % \pic at (2.0,0) {restore icon}; % \pic at (3.5,0) {eliminate icon}; % \pic at (5.0,0) {pool icon}; % \pic at (6.5,0) {oob icon={black}{black}}; % \end{tikzpicture} % \end{center} % % % We will add these as pictures to our export PDF. First, the image % for the pool of units. % % \begin{macrocode} \info{pool-icon}{icon}{} \begin{tikzpicture}[transform shape,scale=.4] \pic{pool icon}; \end{tikzpicture} % \end{macrocode} % % The category \texttt{icon} has no special meaning. % % We also want to add a custom icon for the OOB button. VASSAL has a % button icon for the piece inventory which is really quite % appropriate, but alas it is already in use, so we will make our % own. Here, we use the \TikZ{} picture \texttt{oob icon} provided by % \textsf{wgexport}. This picture needs two arguments: the left hand % and right hand sides fill colours. We will use our background % colours. % % \begin{macrocode} \info{oob-icon}{icon}{} \begin{tikzpicture}[transform shape,scale=.4] \pic{oob icon={a-bg}{b-bg}}; \end{tikzpicture} % \end{macrocode} % % Normally the \texttt{wgexport.py} script uses the \emph{undo} image % for the flip button. However, that may be a bit confusing, so we % will use a custom image for that. We will use the pictures provided % by \textsf{wgexport}. % % % \begin{macrocode} \info{flip-icon}{icon}{} \begin{tikzpicture}[transform shape,scale=.4] \pic{flip icon}; \end{tikzpicture} % \info{eliminate-icon}{icon}{} \begin{tikzpicture}[transform shape,scale=.4] \pic{eliminate icon}; \end{tikzpicture} % \info{restore-icon}{icon}{} \begin{tikzpicture}[transform shape,scale=.4] \pic{restore icon}; \end{tikzpicture} % \end{macrocode} % % \begin{macrocode} \end{imagelist} \end{document} % \end{macrocode} % % \subsection{Make the draft module} % % We run \LaTeX{} on the above \texttt{export.tex} file (the source of % this section) to generate \texttt{export.pdf} and % \texttt{export.json}. We then process these with the % \texttt{wgexport.py} Python script to get the draft VASSAL module % \texttt{Draft.vmod}. % % \begin{verbatim} % `kpsewhich wgexport.py` export.pdf export.json % \end{verbatim} % % The utility \texttt{kpsewhich}\footnotemark{\TeX{}Live and similar % \TeX{} distributions.} will report the location of a file in the % \TeX{} installation tree(s). Note that the \texttt{`} above are % what is typically called `back-ticks' (i.e., what you typically put % as the leading character of scare-crows in \LaTeX{}). This is of % course Un*x-like syntax. For other OSs, consult your \TeX{} % distribution's documentation for how to find files in the \TeX{} % installation. % % You can open the module in the VASSAL editor and see what was % generated. On the board, all areas marked with the \texttt{zone % scope} (or \texttt{zone path}) should be defined as zones. In the % OOB, we should have two zones, one for the A faction and one for the % B faction. We should also have three groups of counters --- one % for each faction and one for ``Markers''. Finally, we should have a % window with tabs, one for each defined chart. % % We can add the rules to the module. So suppose the rules are in % \texttt{game.pdf}, then we can do % % \begin{verbatim} % `kpsewhich wgexport.py` export.pdf export.json \ % -r game.pdf -o Game.vmod % \end{verbatim} % % to add the rules to the ``Help'' menu. Other information is added % to that menu too, such as key-bindings and a short note on how the % module was generated. Of course, you should also see the splash % image that we defined. The option \texttt{-o}~\meta{filename} % writes the module to \meta{filename} rather than the default % \texttt{Draft.vmod}. % % We define the version of the module by passing the option % \texttt{-v}~\meta{version} to the Python script. By default, the % version is set to \texttt{draft}, and a note on the draft is added % to the module and the grids are drawn. Any other version string % will suppress these. % % Also, the default module name is \texttt{Draft} and a similar % description is likewise the default. We can change this by passing % the options \texttt{-t}~\meta{title} and % \texttt{-d}~\meta{description}. Note, you may want to quote the % arguments if they contain spaces or the like. Thus, to make a more % complete module, we would do something like % % \begin{verbatim} % `kpsewhich wgexport.py` export.pdf export.json \ % -r game.pdf -o Game.vmod \ % -t "LaTeX Wargame tutorial" \ % -d "Example of using wargame to make a module" \ % -v 0.1 % \end{verbatim} % % Note that you typically need to quote (\texttt{"}) longer strings % that contain spaces and other special characters. % % \subsection{Going the extra mile} % \label{sec:vassal:patch} % % We will take one more step on the VASSAL module, and then we will % get back to the Print'n'Play version of the game. We can provide % the \texttt{wgexport.py} script with an additional Python script that % can tweak the VASSAL module any way we like. We can for example % move counters into their starting positions, to the OOB, adjust % grids, add more materials, and so on. It is only your imagination, % and Python programming skills, that sets the limits on what you can % do. % % Here we will make a simple \texttt{patch.py} Python script which % does very little. The \textsf{wargame} package, % \textsf{wgexport} class, and \texttt{wgexport.py} script has already % done the heavy work for us. Not least be because we have taken care % to add in \texttt{zone} styles where needed. % % We will put all the counters on the OOB chart, and adjust some grids % - most notably the OOB and turn track grids. Other than that, we % will not do much. % % \begin{verbatim} % `kpsewhich wgexport.py` export.pdf export.json \ % -r game.pdf -o Game.vmod % -t "LaTeX Wargame tutorial" \ % -d "Example of using wargame to make a module" \ % -v 0.1 -p patch.py % \end{verbatim} % % Now for the script: % % \begin{verbatim} % # --- We may need to import the export module --- % # % # from wgexport import * % % def patch(build,data,vmod,verbose=False,**kwargs): % # --- Get the game --- % game = build.getGame() % % # --- Get the maps --- % maps = game.getMaps() % % # --- Get the main board --- % board = maps['Board'] % % # --- Get the mass keys --- % mkeys = board.getMassKeys() % mkeys['Eliminate']['icon'] = 'eliminiate-icon.png' % mkeys['Flip'] ['icon'] = 'flip-icon.png' % % # --- Get the dead-pool map --- % pool = maps['DeadMap'] % pool['icon'] = 'pool-icon.png' % pool.getMassKeys()['Restore']['icon'] = 'restore-icon.png' % % # --- Get the OOB map --- % oob = game.getChartWindows()['OOBs'] % oob['icon'] = 'oob-icon.png' % % % # % # EOF % # % \end{verbatim} % % In the \texttt{patch.py} script we can use all the functionality % provided by \texttt{wgexport.py}. Elements are XML elements that we % apply \texttt{xml.dom.minidom} operations on. % % Note, if we need to use classes, etc.\ from \texttt{wgexport.py}, % then we ought to import that module into our patch script, as shown % in the top comment above. In the example patch script we do not % need that, so we leave it out. % % One can do quite complicated things in VASSAL, which can be set-up % in the patch script. By default, the \texttt{wgexport} script sets % up the pieces and boards, and if one has defined regions with % specific piece names, then the script will likewise place the pieces % there (as with our \texttt{game turn} example above). % % One can, for example, setup the module so that the game turn marker % automatically flips or progresses when the turn track widget reach % specific points. One can in principle also set it up so that when a % specific turn or phase is reach, then pieces are moved from the OOB % to the board. The more one can do like that, the more the game is % automated. % % \iffalse % Local Variables: % mode: docTeX % TeX-master: "game.tex" % End: % \fi