aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/cmd_query.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/cmd_query.cc')
-rw-r--r--src/cmd/cmd_query.cc48
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();
+ }
+}