Newer
Older
\newtoggle{genExamples}
\settoggle{genExamples}{false}
\newtoggle{allyCharacter}
\settoggle{allyCharacter}{false}
\newtoggle{perfectArmour}
\settoggle{perfectArmour}{false}
% _ _
% ___| |_ __ _| |_
% / __| __/ _` | __|
% \__ \ || (_| | |_
% |___/\__\__,_|\__|
%
%
% _ _ _
% | |__ | | ___ ___| | _____
% | '_ \| |/ _ \ / __| |/ / __|
% | |_) | | (_) | (__| <\__ \
% |_.__/|_|\___/ \___|_|\_\___/
%
% This file makes stat blocks for monsters.
%
% The writer feeds in something like this:
%
% \npc{\M}{Patrick the Pyromanacer}
%
% \person{0}% STRENGTH
% {0}% DEXTERITY
% {0}% SPEED
% {{0}% INTELLIGENCE
% {0}% WITS
% {0}}% CHARISMA
% {0}% DR
% {0}% COMBAT
% {}% SKILLS
% {Nothing}% EQUIPMENT
% {}
%
% The \person command takes various stats, and
% inside that 'SKILLS' variable (variable no. 8),
% we can add additional things, like
%
% Most of the rest of the commands deal with
% properly calculating derived stats, like the TN
% to hit the creature.
\newtoggle{examplecharacter}
\settoggle{examplecharacter}{false}
\newtoggle{debug}\settoggle{debug}{false}
\newcommand{\ent}[1]{\textbf{#1}}
\newcommand{\test}{}
\newcommand{\skills}{}
\newcommand{\equipment}{}
\newcommand{\mods}{}
\newcommand\absNum[1]{\ifnum\value{#1}>0+\fi\ifnum\value{#1}=0\else\arabic{#1}\fi}
% we calculate damage here because we can't display 1d6+6 damage - it has to turn into 2d6+2 damage.
\newcommand\conDmg[1]{%
\setcounter{numberofdice}{1}%
\setcounter{damagebonus}{\value{#1}}%
\addtocounter{damagebonus}{-4}%
\whileboolexpr{%
test {\ifnumcomp{\value{damagebonus}}{>}{3}}%
}{%
\addtocounter{numberofdice}{1}%
}%
}
\newcommand\showDam{%
\arabic{numberofdice}D6\absNum{damagebonus}%
\newcommand\dmg[1]{\conDmg{#1}\showDam}
\newcommand\showSkills{
\foreach \s in {Projectiles,Combat,Brawl,Academics,Athletics,Caving,Crafts,Deceit,Empathy,Flight,Medicine,Performance,Larceny,Seafaring,Stealth,Tactics,Vigilance,Wyldcrafting}
{\ifnum\value{\s}>0 \s~\arabic{\s}, \fi}
}
\newcommand\showBoxes{%
\ifnum\value{mp}<1%
\ifnum\value{hp}>11%
\HPboxes%
\else%
\ifnum\value{hp}>6%
\HPHPboxes%
\else%
\HPHPHPboxes%
\fi%
\fi%
\else%
\ifnum\value{sp}<1%
\HPMPboxes%
\else%
\HPMPSPboxes%
\fi%
\fi%
\newcounter{wounds}
\setcounter{wounds}{0}
\newcommand\boxStat[1]{%
\addtocounter{#1}{-\value{wounds}}%
\Repeat{\value{wounds}}{\CheckedBox}%
\Repeat{\value{#1}}{\Square}%
\newcommand\HPboxes{%
\begin{tabular}{r}%
\hiderowcolors%
HP \arabic{hp}~%
\Repeat{\value{noAppearing}}{%
\boxStat{hp} \\%
}%
\end{tabular}%
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
\newcommand\HPHPboxes{%
\begin{tabular}{rr}%
\hiderowcolors%
HP \arabic{hp}~%
\whileboolexpr{test {\ifnumcomp{\value{noAppearing}}{>}{0}}}{%%
\ifnumodd{\value{noAppearing}}{ & \boxStat{hp} \\}{\boxStat{hp}}%%
\addtocounter{noAppearing}{-1}%
}%
\end{tabular}%
}
\newcommand\HPHPHPboxes{%
\begin{tabular}{rrr}%
\hiderowcolors%
HP \arabic{hp}~%
\whileboolexpr{test {\ifnumcomp{\value{noAppearing}}{>}{0}}}{%%
\boxStat{hp}%
\addtocounter{noAppearing}{-1}%
&%
\ifnum\value{noAppearing}>0\boxStat{hp}\fi%
\addtocounter{noAppearing}{-1}%
&%
\ifnum\value{noAppearing}>0\boxStat{hp}\fi%
\addtocounter{noAppearing}{-1}%
\\%
}%
\end{tabular}%
}
\newcommand\HPMPboxes{
\setcounter{enc}{\value{hp}}
\addtocounter{enc}{\value{mp}}
\ifnum\value{enc}<20
\begin{tabular}{rr}
\Repeat{\value{noAppearing}}{
HP \arabic{hp}
\boxStat{hp}
&
MP \arabic{mp}
\boxStat{mp}
\\
}
\end{tabular}
\else
\begin{tabular}{r}
\Repeat{\value{noAppearing}}{
HP \arabic{hp} \boxStat{hp} \\
MP \arabic{mp} \boxStat{mp} \\
}
\end{tabular}
\fi
}
\newcommand\HPMPSPboxes{
\setcounter{enc}{\value{hp}}
\addtocounter{enc}{\value{mp}}
\addtocounter{enc}{\value{sp}}
\ifnum\value{enc}<20
\begin{tabular}{rrr}
\Repeat{\value{noAppearing}}{
HP \arabic{hp}
\boxStat{hp}
&
MP \arabic{mp}
\boxStat{mp}
&
SP \arabic{sp}
\boxStat{sp}
\\
}
\end{tabular}
\else
\ifnum\value{enc}<10
\begin{tabular}{rr}
\Repeat{\value{noAppearing}}{
HP \arabic{hp} \boxStat{hp} &
MP \arabic{mp} \boxStat{mp} \\
& SP \arabic{sp} \boxStat{sp} \\
}
\end{tabular}
\else
\begin{tabular}{r}
MP \arabic{mp} \boxStat{mp} \\
SP \arabic{sp} \boxStat{sp} \\
}
\end{tabular}
\fi
\fi
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
%%%%%%%%%%%%%%%%%%%% Character Generation %%%%%%%%%%%%%%%%%%%%
%
% _
% ___ ___ _ _ _ __ | |_ ___ _ __ ___
% / __/ _ \| | | | '_ \| __/ _ \ '__/ __|
%| (_| (_) | |_| | | | | || __/ | \__ \
% \___\___/ \__,_|_| |_|\__\___|_| |___/
%
%
% Attributes: str, dex, spd, int, wts, cha
% secondary str, dex and spd
\newcounter{att}
\newcounter{dr}
\newcounter{knacks}
% Extras: MP hp fp
% Derived: dicenumber, dicebonus,
\newcounter{mp}
\newcounter{sp}
\newcounter{hp}
\newcounter{fp}
\newcounter{numberofdice}
\newcounter{damagebonus}
\newcounter{xp}
\newcounter{xpbonus}
\newcounter{attackXPtotal}
\newcounter{initiative}
\newcounter{weight}
\newcounter{damage}
\newcounter{shieldBonus}
\newcounter{shieldWeight}
\newcounter{shieldInit}
\newcounter{cost}
\newcounter{heft}% used to see how many AP points to swing a weapon
\newcounter{encumbrance}
\setcounter{encumbrance}{0}
% _
% ___ ___ _ __ ___ _ __ ___ __ _ _ __ __| |___
% / __/ _ \| '_ ` _ \| '_ ` _ \ / _` | '_ \ / _` / __|
% | (_| (_) | | | | | | | | | | | (_| | | | | (_| \__ \
% \___\___/|_| |_| |_|_| |_| |_|\__,_|_| |_|\__,_|___/
%
% magic
\newcommand{\knacks}[1]{\gdef\showKnacks{#1}}
\newcommand\showKnacks{}
Adrenaline~Surge (+1 Damage, once per \ifnum\value{knacks}<2 combat\else round, \arabic{knacks} uses per combat\fi)%
Berserker (+1 \glsentrytext{ap}. on round 2 of combat, +1 Damage. on round 3)%
\newcommand{\brawler}{%
Brawler%
(+2 to unarmed attacks)
}
(+1 \glsentrytext{ap}, Attack, and Damage after charging 6 steps)%
(when an opponent hits 0 \glspl{hp}, damage transfers to the next opponent)%
}
\newcommand{\dodger}{%
(+\arabic{knacks} to dodge projectiles)%
}
\newcommand{\guardian}{%
Guardian
(spend 0 AP to guard someone, and gain +1 to guarding against attacks)%
}
\newcommand{\laststand}{%
(when losing \glspl{hp}, the character gains \setcounter{enc}{2}\addtocounter{enc}{\value{knacks}}\arabic{enc} AP)%
}
\setcounter{enc}{\value{knacks}}\roundUp{enc} (reduce cost to draw longbow by \arabic{enc} AP)
}
\newcommand{\perfectsneakattack}{%
Perfect Sneak Attack
(+\arabic{knacks} Damage for sneak attacks)
}
\newcommand{\precisestrike}{%
Precise Strike
(+1 Attack when calculating \pgls{vitalShot})
\newcommand{\specialist}[1]{%
Specialist
\iftoggle{examplecharacter}{ (+2 when using any #1)}{(#1)}%
}
\newcommand{\stunningstrike}{%
Stunning Strike
(take -1 penalty, and opponent's AP reduces by half Damage)%
}
\newcommand{\snapshot}{%
(Pay 0 AP to reload arrow or draw weapon)%
}
\newcommand{\unstoppable}{%
\addtocounter{hp}{2}%
Unstoppable
(+2 \glsentryshortpl{hp}, and +\arabic{knacks} to any Medicine rolls to save them when dying)%
\newcommand{\vengeful}{%
Vengeful%
\iftoggle{examplecharacter}{ (+2 Intelligence after losing HP)}{}%
}
\newcommand{\weaponmaster}[1]{%
\newcommand{\autophage}{%
\addtocounter{knacks}{1}%
Autophage
\ifnum\value{Wits}>\value{Charisma}%
\global\settoggle{snapCaster}{true}%
\fi%
(spells use Wits and cost 1 less \glsentrytext{ap})
\newcommand{\ritualcaster}{%
\addtocounter{knacks}{1}%
Ritual Caster
(spells use Intelligence, caster may spend 1 extra \gls{mp})
}
\newcommand{\fasthealer}{%
Fast Healer
\newcommand{\combatcaster}{Combat Caster}
\newcommand\chosenEnemy[1]{Chosen Enemy (+1 against #1, -2 when trying to be friendly)}
% _ __ ___ _ __ ___ ___ _ __
%| '_ \ / _ \ '__/ __|/ _ \| '_ \
%| |_) | __/ | \__ \ (_) | | | |
%| .__/ \___|_| |___/\___/|_| |_|
%|_|
%
%
% _ _
%% ___| |__ __ _ _ __ __ _ ___| |_ ___ _ __
%% / __| '_ \ / _` | '__/ _` |/ __| __/ _ \ '__|
%%| (__| | | | (_| | | | (_| | (__| || __/ |
%% \___|_| |_|\__,_|_| \__,_|\___|\__\___|_|
%%
%% optional counters, such as mana, are cleaned
%% clear: weaponsknack1 and 2,
%%
%
\newcommand{\mind}[3]{
\setcounter{Intelligence}{#1}\setcounter{Wits}{#2}\setcounter{Charisma}{#3}
\newtoggle{snapCaster}
\settoggle{snapCaster}{true}
\setcounter{Dexterity}{#2}
\setcounter{Speed}{#3}
\renewcommand{\skills}{#7}
\renewcommand{\equipment}{#8}
before upper={\parindent0pt},
ornamented,
fontupper=\small,
halign=flush left,
\derivedstats
\end{tcolorbox}
\vspace{2em}
\noindent
\begin{minipage}{\linewidth}
\hrulefill\hspace{-0.15em}\raisebox{-1em}{\huge\npcsymbol}
\begin{center}\textbf{\large\name}\end{center}
#9%
\hphantom{\equipment}%
\vspace{-2em}
\textbf{Mannerism:}~\mannerism
\par
\textbf{Description:}~\NPCdescription
\ifdefempty{\npcQuote}{}{\par
\textbf{Quote:}~\textit{``\npcQuote''}
\settoggle{personality}{false}}%
{}
\setcounter{Dexterity}{#2}
\setcounter{Speed}{#3}
\setcounter{Wits}{#4}
\renewcommand{\skills}{#7}
\renewcommand{\abilities}{#8}
\begin{tcolorbox}[
title={\npcsymbol\ \name},
before upper={\parindent0pt},
ornamented,
left=5pt,
right=5pt,
top=0pt,
bottom=0pt,
\begin{minipage}{\linewidth}
\hrulefill\hspace{-0.15em}\raisebox{-1em}{\huge\npcsymbol}
\begin{center}\textbf{\large\name}\end{center}
#9%
\hphantom{\abilities}%
\vspace{-2em}
\foreach \s in {Air,Earth,Fate,Fire,Water,Projectiles,Combat,Brawl,Academics,Alchemy,Athletics,Caving,Crafts,Deceit,Empathy,Flight,Medicine,Performance,Larceny,Seafaring,Stealth,Tactics,Vigilance,Wyldcrafting}%
\setcounter{fp}{0}
\setcounter{sp}{0}
\setcounter{heft}{1}
\setcounter{weight}{0}
\setcounter{encumbrance}{0}
\setcounter{knacks}{0}
\setcounter{mp}{0}
\setcounter{xpbonus}{0}
}
%% _ _ _ _ _
%% __ _| |_| |_ _ __(_) |__ _ _| |_ ___ ___
%% / _` | __| __| '__| | '_ \| | | | __/ _ \/ __|
%%| (_| | |_| |_| | | | |_) | |_| | || __/\__ \
%% \__,_|\__|\__|_| |_|_.__/ \__,_|\__\___||___/
%%
%% Print the line,
%% print the attributes.
%% print the skills
%% print the knacks
%% print the equipment
%
\newcommand{\creaturestats}{
% Reference versions (which always are non-verbose) don't
% have the space for full-sized stats.
\begin{tabularx}{\textwidth}{lr@{\hskip 3em}lr@{\hskip 3em}lr}
% the tcolorbox has coloured rows (xcolor package)
% but that doesn't work with creature stats, so we suppress it here
\hiderowcolors
Strength & \arabic{Strength} & Dexterity & \arabic{Dexterity} & Speed & \arabic{Speed} \\
Intelligence & \arabic{Intelligence} & Wits & \arabic{Wits} & Charisma & \arabic{Charisma} \\}{%
&& Wits & \arabic{Wits}
&
\ifnum\value{Charisma}>0
Charisma & \arabic{Charisma}
\fi
\\
\foreach \s in {Air,Earth,Fate,Fire,Water}%
{\ifnum\value{\s}>0 \addtocounter{mp}{3}\fi}
\begin{tabular}{p{.15\textwidth}>{\raggedright\arraybackslash}p{.75\textwidth}}
\skills \\
}{}
\ifdefempty{\showKnacks}{}{
\foreach \s in {Air,Earth,Fate,Fire,Water}%
{\ifnum\value{\s}>0 \s~\arabic{\s}, \fi}
\\
\fi
\iftoggle{mind}%
{%
\ifdefempty{\equipment}{}
{
\setcounter{attackXPtotal}{\value{Charisma}}% Must store Charisma while talisman shows spells
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
%%
%%
%% _ _
%% ___ ___ _ __ ___ _ __ ___| |_ __ _| |_ ___
%% / __/ _ \| '_ ` _ \| '_ \/ __| __/ _` | __/ __|
%%| (_| (_) | | | | | | |_) \__ \ || (_| | |_\__ \
%% \___\___/|_| |_| |_| .__/|___/\__\__,_|\__|___/
%% |_|
%%
\newcommand\computeStats{
\addtocounter{hp}{6}%
% Stats for allies don't need to show Combat +1 as 'TN 8 to hit', they just need to show '+1'.
\ifnum\value{Combat}>\value{Brawl}\else\setcounter{att}{\value{Brawl}}\fi%
\iftoggle{allyCharacter}{}{%
\addtocounter{att}{7}%
}%
\addtocounter{att}{\value{Dexterity}}%
\setcounter{maxWeight}{\value{hp}}% now to compute encumbrance
\divide\value{maxWeight} by 2%
\ifnum\value{weight}>\value{maxWeight}%
\addtocounter{encumbrance}{\value{weight}}%
\addtocounter{encumbrance}{-\value{maxWeight}}%
\fi%
\setcounter{ap}{\value{Speed}}%
\addtocounter{ap}{3}%
\addtocounter{ap}{-\value{encumbrance}}%
}
%% _ _ _
%% __| | ___ _ __ ___| |_ __ _| |_ ___
%% / _` |/ _ \ '__/ __| __/ _` | __/ __|
%%| (_| | __/ | \__ \ || (_| | |_\__ \
%% \__,_|\___|_| |___/\__\__,_|\__|___/
%%
%%
%% dice instead of Damage
%% print out att, spd, DAM, dex, dr (type), str
%%
%
\newcommand{\derivedstats}{%
\setlength\topsep{0pt}%
\setlength\parskip{0pt}%
\iftoggle{verbose}{\par\hrulefill}{}%
\iftoggle{debug}{str: \arabic{Strength}, dex: \arabic{Dexterity}, spd: \arabic{Speed}, att: \arabic{att}, damage: \arabic{damage}, Attack total: \arabic{attackXPtotal}, Def Total: \arabic{defenceXPtotal}}{}
\iftoggle{verbose}{\normalsize}{\large}%
\scshape AP \ifnum\value{ap}<1 $\frac{1}{2}$ \else \arabic{ap}\fi%
\ifnumcomp{\value{heft}}{>}{1}{ (AP Cost: \arabic{heft})}{},
\iftoggle{allyCharacter}{$2D6$\ifnum\value{att}>-1 +\fi}{}%
\addtocounter{damage}{\value{Strength}}
\ifnumcomp{\value{dr}}{>}{0}{%
\setcounter{enc}{\value{att}}%
\addtocounter{enc}{\value{covering}}%
\mbox{DR \arabic{dr}%
\iftoggle{perfectArmour}%
{}%
{ (\arabic{enc}!)}, }%
\fi%
\ifnum\value{sp}>0%
SP \arabic{sp},
\fi%
\iftoggle{examplecharacter}{}{%
\calculateXP%
\outline{\glsentrytext{cr}: \showCR}%
}%
%
%
%% __ ______
%% \ \/ / _ \
%% \ /| |_) |
%% / \| __/
%% /_/\_\_|
%%
%%% Now to get the XP value of the creature's attack ability.
%%% = Attack (TN) * Dam + max((spd-hef),mp)^2
\setcounter{attackXPtotal}{\value{att}}%
\multiply\value{attackXPtotal} by \value{damage}%
\addtocounter{Speed}{-\value{heft}}%
\ifnum\value{Speed}>\value{mp}%
\setcounter{enc}{\value{Speed}}%
\fi%
\multiply\value{enc} by\value{enc}%
\addtocounter{attackXPtotal}{\value{enc}}%
%%% And now the XP defence total.
%%% = (att - 7 + dr) x hp
\ifnum\value{att}>7%
\setcounter{defenceXPtotal}{\value{att}}%
\addtocounter{defenceXPtotal}{-7}%
\else%
\setcounter{defenceXPtotal}{0}%
\fi%
\addtocounter{defenceXPtotal}{\value{dr}}%
\multiply\value{defenceXPtotal} by\value{hp}\addtocounter{defenceXPtotal}{0}%
% XP = attackXPtotal + defenceXPtotal
\setcounter{xp}{\value{attackXPtotal}}%
\addtocounter{xp}{\value{defenceXPtotal}}%
\iftoggle{debug}{str: \arabic{Strength}, dex: \arabic{Dexterity}, spd: \arabic{Speed}, att: \arabic{att}, damage: \arabic{damage}, weight: \arabic{weight}, encumbrance: \arabic{encumbrance}, XP Bonus: \arabic{xpbonus}, Attack total: \arabic{attackXPtotal}, Def Total: \arabic{defenceXPtotal}, mp: \arabic{mp} Grand Total: \arabic{xp}}{\iftoggle{verbose}{\hrulefill}}%
\ifnumcomp{\value{xp}}{<}{73}%
{\ifnumcomp{\value{xp}}{<}{40}%
{\renewcommand\showCR{\arabic{xpbonus}}}{\renewcommand\showCR{$\frac{1}{2}$}}}%
\addtocounter{xp}{-60}%
\divide\value{xp} by 13%
\addtocounter{xp}{\value{xpbonus}}%
% if the creature has a mind, print fate points (if any).
\addtocounter{fp}{\value{Charisma}}%
\ignorespaces\arabic{fp}~\glsentrytext{fp}%
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
\newcommand\swarm[6][]%
{
\begin{tcolorbox}[
title={\A\ Swarm: #2},
before upper={\parindent0pt},
ornamented,
fontupper=\small,
halign=flush left,
left=10pt,
right=15pt,
top=0pt,
bottom=0pt,
]
\clean
\setcounter{hp}{#3}
\setcounter{Dexterity}{#4}
\setcounter{att}{#4}
\addtocounter{att}{10}
\setcounter{Speed}{#5}
\setcounter{ap}{#5}
\addtocounter{ap}{3}
\setcounter{Wits}{#6}
\renewcommand\abilities{#1}
\scshape
\hiderowcolors
\Gls{ap}: \arabic{ap} & Att: $\arabic{att} - HP$
\iftoggle{verbose}{
& Speed: \arabic{Speed}
& Wits: \arabic{Wits}
}{
& Dam: 1
}
\\
&
\iftoggle{genExamples}%
{HP: \arabic{hp}
\\
}%
\newcommand\hide[1]{%
\setcounter{dr}{#1}%
}
\ifnum\value{Brawl}<3%
\setcounter{Brawl}{2}%
\fi%
\renewcommand\abilities{%
Undead%
\ifnum\value{dr}>1%
\stepcounter{dr}%
\else%
\setcounter{dr}{2}%
\fi%
}%
}
\setcounter{track}{\value{Dexterity}}%
\glsentrytext{tn} \arabic{track} to dodge)%
\addtocounter{track}{\value{Strength}}%
\dmg{track} Damage each turn of grappling)%
\setcounter{diceNo}{\value{hp}}\divide\value{diceNo} by 2%
Regeneration (1 \glsentrytext{hp}/ round, max. \arabic{diceNo})%
Viscid (on a tie, the attacker \emph{must} inflict Damage, but the weapon sticks into the body,
\setcounter{track}{\value{Strength}}%
\newcommand\gloopy{%
Liquid (non-fire Damage removes 2~\glsfmtplural{hp} but creates a 1~\glsentrytext{hp} copy)%
}
\newcommand{\claws}{%
Claws (+1~Damage)%
\ifnum\value{Combat}>\value{Brawl}\else%
\stepcounter{damage}%
\fi%
\newcommand{\fireBreath}{%
Fiery breath (equivalent to a torch)%
}
% To fly, creatures should have Speed
% + Dexterity greater than Strength +
% DR.
\addtocounter{enc}{\value{Strength}}%
\setcounter{track}{\value{Speed}}%
\addtocounter{track}{\value{Air}}%
\ifnum\value{enc}>\value{track}%
(can glide, but not fly)
\ifnum\value{enc}=\value{track}%
(moves at x8 speed, must run before takeoff)%
\fi%
\fi%
}
\newcommand{\stench}{%
Stench (breathing in demands \roll{Strength}{Wyldcrafting} check, \glsentrytext{tn}
\addtocounter{track}{-\value{Speed}}%
)
}
\newcommand{\crazyGas}{%
\addtocounter{track}{\value{Strength}}%
\arabic{track} \glspl{ep} per round)%