diff options
Diffstat (limited to 'src/cmd/cmd_query.cc')
-rw-r--r-- | src/cmd/cmd_query.cc | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/cmd/cmd_query.cc b/src/cmd/cmd_query.cc new file mode 100644 index 0000000..9c2dae6 --- /dev/null +++ b/src/cmd/cmd_query.cc @@ -0,0 +1,48 @@ +#include "cmd.h" +#include "../utils.h" +#include "../creature.h" +#include "../dice.h" +#include "../weapon.h" +#include <sstream> + +namespace cmd { + std::string attacks(std::vector<std::string> args) { + std::stringstream text; + auto c = utils::instantiate<creature::Creature>(getTruePath(args[0])); + for(auto w : creature::getAttacks(*c)) { + text << w->getName() << std::endl; + } + return text.str(); + } + + std::string roll(std::vector<std::string> args) { + std::stringstream text; + auto c = utils::instantiate<creature::Creature>(getTruePath(args[0])); + args.erase(args.begin()); + std::string rollName = utils::join(args, " "); + utils::lower(rollName); + int rolled = dice::roll(20); + // Search through skills, saves, and attacks to roll + if(rollName == "init" or rollName == "initiative") { + text << formatRoll("Initiative", "check", rolled, c->getInitiative()); + } + rules::Skill skill = rules::tryGetAbilityOrSkill<rules::Skill>(rollName); + rules::Ability ability = rules::tryGetAbilityOrSkill<rules::Ability>(rollName); + if(skill) { + text << formatRoll(skill.getName(), "check", rolled, c->getSkillBonus(skill)); + } else if(ability) { + text << formatRoll(ability.getFull(), "save", rolled, c->getAbilitySaveBonus(ability)); + } else { + for(auto w : creature::getAttacks(*c)) { + if(w->getName() == rollName) { + text << w->getText(*c) << std::endl; + int bonus = w->getToHitBonus(*c); + text << formatRoll(w->getName(), "attack", rolled, bonus); + text << " on hit: " << entry::formatDmg(*w, *c) << std::endl; + break; + } + } + } + return text.str(); + } +} |