% 
%  __  __             _      
% |  \/  | __ _  __ _(_) ___ 
% | |\/| |/ _` |/ _` | |/ __|
% | |  | | (_| | (_| | | (__ 
% |_|  |_|\__,_|\__, |_|\___|
%               |___/        


% Some spells inflict X fatigue, where X is the spell level plus 2.
\newcounter{spellCost}
  \setcounter{spellCost}{1}
\newcounter{spellPlusTwo}
  \setcounter{spellPlusTwo}{1}
\newcounter{castingBonus}
  \setcounter{castingBonus}{1}

\newcommand\spellName{}
\newcommand\spellEnhancements{}
\newcommand\spellAction{}
\newcommand\spellSphere{}
\newcommand\spellResistance{}
\newcommand\spellSum{}
\newcommand\spellNotes{}

\newcounter{spellTargets}
\setcounter{spellTargets}{1}

\newcommand\calcSpell[7]{%
  \renewcommand\spellName{#1}%
  \setcounter{spellCost}{1}%
  \setcounter{spellTargets}{1}%
  \togglefalse{distant}%
  \togglefalse{duplicated}%
  \foreach \d in {#2}{%
    \ifdefstring{\d}{distant}{\global\toggletrue{distant}}{}%
    \ifdefstring{\d}{duplicated}{\global\toggletrue{duplicated}}{}%
    \stepcounter{spellCost}%
  }%
  \setcounter{spellPlusTwo}{\value{spellCost}}%
    \addtocounter{spellPlusTwo}{2}%
  \renewcommand\spellEnhancements{#2}%
  \renewcommand\spellAction{#3}%
  \renewcommand\spellSphere{#4}%
  % What bonus does the caster receive?  Some spells will display the caster's current Bonus, so we must calculate it.  We start by setting it sky-high, then for each element in {Earth,Fire}, et c. we check if this is lower than the current castingBonus, if (if so), lower the bonus.
  \setcounter{castingBonus}{10}%
  \foreach \e in {#4}{%
    \ifnum\value{\e}<\value{castingBonus}%
      \setcounter{castingBonus}{\value{\e}}%
    \fi%
  }{}%
  \iftoggle{snapCaster}{%
    \addtocounter{castingBonus}{\value{Wits}}%
  }{%
    \addtocounter{castingBonus}{\value{Charisma}}%
  }%
  \renewcommand\spellResistance{#5}
  \renewcommand\spellSum{#6}
  \renewcommand\spellNotes{#7}
  \setRange%
    \multiply\value{spellTargets} by \value{spellCost}%
    \multiply\value{spellTargets} by \value{spellCost}%
    \addtocounter{spellTargets}{0}%
  \iftoggle{distant}{%
    \foreach \x in {1,...,\arabic{spellCost}}%
      {\multiply\value{spellTargets} by 10\addtocounter{spellTargets}{0}}%
  }{}%
  \index[spells]{\textbf{#1} Cost: \arabic{spellCost}, \spellEnhancements\ \spellAction~\spellSphere, Range: \spellRange, Targets: \arabic{spellTargets}, Resisted by: \detokenize{#5}, \spellSum}
}

\newcommand\fullSpell{%
  \paragraph{\spellName}

  Cost: \arabic{spellCost},
  \spellEnhancements,
  \spellAction~
  \spellSphere

  Resisted by: \spellResistance,
  Range: \spellRange
  \ifnum\value{spellTargets}>1%
    , Targets: \arabic{spellTargets}
  \fi

  \spellSum \ 
  \spellNotes
}

\newcommand\spellIndex{\index[spells]{\textbf{\spellName} Cost: \arabic{spellCost}, \spellEnhancements, \spellAction~\spellSphere, Range: \spellRange, \ifnum\value{spellTargets}>1 Targets: \arabic{spellTargets}, \fi Resisted by: \detokenize{\spellResistance}, \spellSum \spellNotes }}

\newcommand\shortSpell{%
  \addtocounter{castingBonus}{7}%
  \item[\spellName]
  Cost: \arabic{spellCost},
  \spellEnhancements~
  \spellAction~
  \spellSphere

  Resisted by: \spellResistance\ (\tn[\arabic{castingBonus}])

  \spellSum \ 
  \spellNotes
}


\newcommand\spell[7]{%
  \calcSpell{#1}{#2}{#3}{#4}{#5}{#6}{#7}%
  \iftoggle{fullSpells}{%
    \fullSpell%
  }{%
    \shortSpell%
  }%
}

\newcommand\spellRange{}
\newcommand\setRange{%
  \iftoggle{distant}%
    {%
      \ifcase\value{spelllevel}\relax%
      \renewcommand\spellRange{Error}%
      \or%
      \renewcommand\spellRange{Error}%
      \or%
        \renewcommand\spellRange{throwing distance}%
      \or%
        \renewcommand\spellRange{shouting distance}%
      \or%
        \renewcommand\spellRange{horizon}%
      \else%
        \renewcommand\spellRange{line of sight}%
      \fi%
    }%
    {%
      \setcounter{track}{20}%
      \Repeat{\arabic{spelllevel}}{\addtocounter{track}{-4}}%
      \ifnum\value{track}<1%
        \renewcommand\spellRange{touch}%
      \else%
        \renewcommand\spellRange{\arabic{track}~steps}%
      \fi%
    }%
}


%%%

\newtoggle{fullSpells}
  \settoggle{fullSpells}{true}
\newtoggle{insubstantial}
  \settoggle{insubstantial}{false}
\newtoggle{distant}
  \settoggle{distant}{false}
\newtoggle{duplicated}
  \settoggle{duplicated}{false}

\newcommand\showStdSpells{
  \setcounter{enc}{0}
  \begin{description}
    \settoggle{fullSpells}{false}
    \foreach\n in {3,2,1}{
      \ifnum\value{enc}<3
        \foreach \s in {Earth,Air,Fire,Water,Fate}{
          \ifnumcomp{\value{\s}}{=}{\n}{
              \input{config/spells/\s\n.tex}
              \stepcounter{enc}
          }{}
        }
      \fi
    }
  \end{description}
  \textcolor{\pageSideColor}{\hrulefill\raisebox{-3pt}{\npcsymbol}}
}

\newcommand\showSpells[1]{
  \needspace{3em}
  \settoggle{fullSpells}{true}
  \foreach \s in {#1}{
    \input{config/spells/\s.tex}
  }
}