From 4618763c0e3a723bf4bb43c7b9edbce87240e0af Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 16 Apr 2021 11:23:27 -0400 Subject: Rebased feature/item on entry --- src/spellcasting.cc | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 src/spellcasting.cc (limited to 'src/spellcasting.cc') diff --git a/src/spellcasting.cc b/src/spellcasting.cc new file mode 100644 index 0000000..62af6de --- /dev/null +++ b/src/spellcasting.cc @@ -0,0 +1,68 @@ +#include "spellcasting.h" +#include "creature.h" +#include "utils.h" +#include +#include +#include + +using namespace std; + +namespace entry { + string Spellcasting::getText(const creature::Creature& c) const { + return genText(*this, c); + } + + string toOrdinal(size_t number) { + string suffix = "th"; + if (number % 100 < 11 || number % 100 > 13) { + switch (number % 10) { + case 1: + suffix = "st"; + break; + case 2: + suffix = "nd"; + break; + case 3: + suffix = "rd"; + break; + } + } + return to_string(number) + suffix; + } + + string genText(const Spellcasting& s, const creature::Creature& c) { + stringstream text; + text << genText(static_cast(s), c); + text << ": Spellcasting ability: " << s.getAbility(); + text << " (spell save DC " << 8 + c.getBonus(s.getAbility()) + c.getProficiency(); + text << ", +" << c.getBonus(s.getAbility()) + c.getProficiency() << " to hit with spell attacks)."; + if(s.isInnate()) { + text << " (spellcasting is innate)."; + } + int levelNumber = 0; + for(auto level : s.getSpellsBySlot()) { + text << "\n"; + if(level.numSlots == 0) { + if(s.isInnate()) { + text << "At will: "; + } else { + text << "Cantrips: "; + } + } else { + if(s.isInnate()) { + text << level.numSlots << "/day each: "; + } else { + text << toOrdinal(levelNumber) << " level (" << level.numSlots << " slots): "; + } + } + vector names; + for(auto spell : level.spells) { + names.push_back(spell.getName()); + } + text << utils::join(names, ", "); + levelNumber++; + } + + return text.str(); + } +} -- cgit v1.2.3