You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
155 lines
4.6 KiB
155 lines
4.6 KiB
% Monster environment sty file
|
|
\RequirePackage{fp}
|
|
\RequirePackage{xstring}
|
|
|
|
% Macro to print stats with autocomputed modifier
|
|
% e.g. \stat{12} prints "12 (+1)"
|
|
\newcommand{\stat}[1]{%
|
|
\FPeval{\mod}{(#1 - 10)/2}%
|
|
\FPifpos\mod%
|
|
\FPeval{\mod}{clip(trunc(mod,0))}#1\ (+\mod)%
|
|
\else%
|
|
\FPeval{\mod}{clip(abs(trunc(mod-0.5,0)))}#1\ (\(-\)\mod)%
|
|
\fi%
|
|
}
|
|
|
|
% Macro to print avarage dice based value
|
|
% e.g. \dice{2d6+3} prints "10 (2d6 + 3)"
|
|
\newcommand{\dice}[1]{%
|
|
\StrSubstitute{#1}{ }{}[\DiceArg]% strip whitespaces
|
|
\StrCut{\DiceArg}{d}\DiceNum\DiceSides% split string
|
|
\StrCut{\DiceSides}{+}\DiceSides\DiceAddMod%
|
|
\StrCut{\DiceSides}{-}\DiceSides\DiceSubMod%
|
|
\FPeval{\DiceAvg}{(\DiceSides+1)/2*\DiceNum}% calculate avg roll
|
|
\IfInteger{\DiceAddMod}{%
|
|
\FPadd{\DiceAvg}{\DiceAvg}{\DiceAddMod}% add value
|
|
\def\DiceMod{ + \DiceAddMod}%
|
|
}{%
|
|
\IfInteger{\DiceSubMod}{%
|
|
\FPsub{\DiceAvg}{\DiceAvg}{\DiceSubMod}% subtract value
|
|
\def\DiceMod{ \(-\) \DiceSubMod}%
|
|
}{%
|
|
\def\DiceMod{}%
|
|
}%
|
|
}%
|
|
\FPtrunc{\DiceAvg}{\DiceAvg}{0}% round down
|
|
\FPprint{\DiceAvg\ (\DiceNum d\DiceSides\DiceMod)}
|
|
}
|
|
|
|
% Monster box made to look like the Monster Manual NPC definitions
|
|
\newtcolorbox{monsterboxnobg}[2][]{
|
|
enhanced,
|
|
frame hidden,
|
|
before skip=7pt plus2pt,
|
|
boxrule=0pt,
|
|
breakable,
|
|
boxsep=0.25ex,
|
|
toptitle=3mm,
|
|
left=2.5mm,
|
|
right=2.15mm,
|
|
arc=0mm,
|
|
opacityback=0,
|
|
colframe=titlered,
|
|
fonttitle=\jebba@StatBlockTitleFont\color{titlered}\Large,
|
|
fontupper=\jebba@StatBlockBodyFont,
|
|
title=#2,
|
|
after={\vspace{7pt plus 1pt}\noindent},
|
|
#1
|
|
}
|
|
|
|
% new Monsterbox
|
|
\newtcolorbox{monsterbox}[2][]{
|
|
enhanced,
|
|
frame hidden,
|
|
before skip=7pt plus2pt,
|
|
boxrule=0pt,
|
|
breakable,
|
|
boxsep=0.25ex,
|
|
toptitle=3mm,
|
|
left=2.5mm,
|
|
right=2.15mm,
|
|
arc=0mm,
|
|
borderline north={4pt}{0pt}{titlered},
|
|
borderline north={2.5pt}{0.75pt}{statblockribbon},
|
|
borderline south={4pt}{0pt}{titlered},
|
|
borderline south={2.5pt}{0.75pt}{statblockribbon},
|
|
colback=statblockbg,
|
|
colbacktitle=statblockbg,
|
|
colframe=titlered,
|
|
fonttitle=\jebba@StatBlockTitleFont\color{titlered}\Large,
|
|
fontupper=\jebba@StatBlockBodyFont,
|
|
title=#2,
|
|
after={\vspace{7pt plus 1pt}\noindent},
|
|
#1
|
|
}
|
|
|
|
|
|
% Define Monster subsection header style
|
|
%\newcommand{\monstersection}[1]{\subsubsection*{#1}}
|
|
\newcommand{\monstersection}[1]{
|
|
{\par
|
|
\color{titlered}\jebba@StatBlockSubtitleFont\large #1 \vspace{3pt}
|
|
\titleline{\color{titlered}\titlerule[0.6pt]}
|
|
\par\medskip}
|
|
}
|
|
|
|
\newenvironment{monsteraction}[1][\unskip]{\emph{\textbf{#1.}}}{\vspace{0.5em}}
|
|
|
|
%
|
|
% Macros for use within the monster environment
|
|
%
|
|
\newkeycommand\basics[armorclass=0, hitpoints=0, speed=0]{%
|
|
\color{titlered}
|
|
\textbf{\armorclassname} \commandkey{armorclass}\\
|
|
\textbf{\hitpointsname} \commandkey{hitpoints}\\
|
|
\textbf{\speedname} \commandkey{speed}\\
|
|
}
|
|
|
|
% Taubular enviornment for stats-block
|
|
\newkeycommand\stats[STR=\stat{10},
|
|
DEX=\stat{10},
|
|
CON=\stat{10},
|
|
INT=\stat{10},
|
|
WIS=\stat{10},
|
|
CHA=\stat{10}]{
|
|
{\footnotesize
|
|
\hspace*{-3.5pt}
|
|
\resizebox{0.97\linewidth}{\height}{
|
|
\begin{tabular}{cccccc}
|
|
\rule{0pt}{3.7mm} %adds space between hline and table
|
|
\textbf{\strstatname} & \textbf{\dexstatname} & \textbf{\constatname} & \textbf{\intstatname} & \textbf{\wisstatname} & \textbf{\chastatname}\\
|
|
\commandkey{STR} & \commandkey{DEX} & \commandkey{CON} & \commandkey{INT} & \commandkey{WIS} & \commandkey{CHA}
|
|
\end{tabular}
|
|
}
|
|
\\[0.4em] %adds space after table
|
|
}
|
|
}
|
|
|
|
\newkeycommand\details[skills=,
|
|
damageimmunities=,
|
|
savingthrows=,
|
|
conditionimmunities=,
|
|
damageresistances=,
|
|
damagevulnerabilities=,
|
|
senses=---,
|
|
languages=---,
|
|
challenge=0]{%
|
|
\ifcommandkey{savingthrows}
|
|
{\textbf{\savesname} \commandkey{savingthrows}\\}{}
|
|
\ifcommandkey{skills}
|
|
{\textbf{\skillsname} \commandkey{skills}\\}{}
|
|
\ifcommandkey{damagevulnerabilities}
|
|
{\textbf{\dvulname} \commandkey{damagevulnerabilities}\\}{}
|
|
\ifcommandkey{damageresistances}
|
|
{\textbf{\dresname} \commandkey{damageresistances}\\}{}
|
|
\ifcommandkey{damageimmunities}
|
|
{\textbf{\dimmname} \commandkey{damageimmunities}\\}{}
|
|
\ifcommandkey{conditionimmunities}
|
|
{\textbf{\cimmname} \commandkey{conditionimmunities}\\}{}
|
|
% These traits appear to always be present.
|
|
{\textbf{\sensesname} \commandkey{senses}\\}
|
|
{\textbf{\languagesname} \commandkey{languages}\\}
|
|
{\textbf{\challengename} \commandkey{challenge}\\}
|
|
\color{black}
|
|
}
|