aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYour Name <you@example.com>2021-05-02 10:12:49 -0400
committerYour Name <you@example.com>2021-05-02 10:12:49 -0400
commit77b43093c7b157e8ff0b68af4efd0eff226da35a (patch)
treeaf051e78ebe6c26ea373b50fb266935e0b51f9fa
parent9e6936d325751a7e0670e8cc6aa61faf048cb241 (diff)
downloaddmtool-77b43093c7b157e8ff0b68af4efd0eff226da35a.tar.gz
dmtool-77b43093c7b157e8ff0b68af4efd0eff226da35a.tar.bz2
dmtool-77b43093c7b157e8ff0b68af4efd0eff226da35a.zip
Added damage and heal commands
-rw-r--r--src/creature.cc13
-rw-r--r--src/creature.h1
-rw-r--r--src/dmtool.cc69
-rw-r--r--src/rules.cc10
-rw-r--r--src/rules.h3
-rw-r--r--src/utils.h2
6 files changed, 89 insertions, 9 deletions
diff --git a/src/creature.cc b/src/creature.cc
index 88b26e7..e1f2b61 100644
--- a/src/creature.cc
+++ b/src/creature.cc
@@ -104,6 +104,13 @@ namespace creature {
}
}
+ void Creature::applyHealing(int amount) {
+ hp += amount;
+ if(hp > hpMax) {
+ hp = hpMax;
+ }
+ }
+
int Creature::getSkillBonus(const rules::Skill& skill) const {
int bonus = this->getBonus(skill.getAbility());
if(skills.contains(skill)) {
@@ -150,7 +157,13 @@ namespace creature {
}
void Creature::setScore(const rules::Ability& ability, int score) {
+ int initBonus = getBonus(ability);
stats.insert({ability, score});
+ if(ability == rules::Ability::Con()) {
+ int delta = getBonus(ability) - initBonus;
+ hpMax += delta * hdCount;
+ hp += delta * hdCount;
+ }
}
void Creature::setProfLevel(const rules::Skill& skill, int level) {
diff --git a/src/creature.h b/src/creature.h
index e89978e..ee4d5ba 100644
--- a/src/creature.h
+++ b/src/creature.h
@@ -84,6 +84,7 @@ namespace creature {
// Setters (mutators)
void setGivenName(std::string name) {givenName = name;}
void applyDamage(int amount, const std::string& type, const std::vector<std::string>& qualifiers);
+ void applyHealing(int amount);
void setScore(const rules::Ability& ability, int score);
void setProfLevel(const rules::Skill& skill, int level);
void addInventoryItem(std::shared_ptr<entry::Item> item);
diff --git a/src/dmtool.cc b/src/dmtool.cc
index c644026..18af9e8 100644
--- a/src/dmtool.cc
+++ b/src/dmtool.cc
@@ -161,18 +161,12 @@ void cp(fs::path src, fs::path dest) {
}
void cp(std::vector<std::string> args) {
- if(args.size() != 2) {
- throw std::runtime_error("Subcommand 'cp' expected 2 arguments but got " + std::to_string(args.size()));
- }
// Operate by intantiating and saving
// We do recursive!
cp(getTruePath(args[0]), getTruePath(args[1]));
}
void mv(std::vector<std::string> args) {
- if(args.size() != 2) {
- throw std::runtime_error("Subcommand 'mv' expected 2 arguments but got " + std::to_string(args.size()));
- }
fs::rename(getTruePath(args[0]), getTruePath(args[1]));
}
@@ -218,12 +212,70 @@ void roll(std::vector<std::string> args) {
}
}
-void damage(std::vector<std::string> args) {}
-void heal(std::vector<std::string> args) {}
+void damage(std::vector<std::string> args) {
+ fs::path p = getTruePath(args[0]);
+ std::shared_ptr<entry::Entry> e = instantiate(p);
+ std::shared_ptr<creature::Creature> c = std::dynamic_pointer_cast<creature::Creature>(e);
+ if(! c) {
+ throw std::runtime_error("Subcommand 'damage' expected a creature but was given an instance of " + e->getType());
+ }
+ int dmg = 0;
+ try {
+ dmg = std::stoi(args[1]);
+ } catch(std::exception& e) {
+ throw std::runtime_error("Subcommand 'damage' expected an integer but was given " + args[1]);
+ }
+ std::string dmgType = "force";
+ if(args.size() == 3) {
+ dmgType = args[2];
+ }
+ std::vector<std::string> qualifiers; // TODO
+ int initHP = c->getHP();
+ c->applyDamage(dmg, dmgType, qualifiers);
+ std::cout << "Applying " << dmg << " " << dmgType << " damage to " << c->getGivenName() << " the " << c->getCreatureName() << ". HP: " << initHP << " -> " << c->getHP() << "." << std::endl;
+ save(c, p);
+}
+
+void heal(std::vector<std::string> args) {
+ fs::path p = getTruePath(args[0]);
+ std::shared_ptr<entry::Entry> e = instantiate(p);
+ std::shared_ptr<creature::Creature> c = std::dynamic_pointer_cast<creature::Creature>(e);
+ if(! c) {
+ throw std::runtime_error("Subcommand 'heal' expected a creature but was given an instance of " + e->getType());
+ }
+ int amnt = 0;
+ try {
+ amnt = std::stoi(args[1]);
+ } catch(std::exception& e) {
+ throw std::runtime_error("Subcommand 'heal' expected an integer but was given " + args[1]);
+ }
+ int initHP = c->getHP();
+ c->applyHealing(amnt);
+ std::cout << "Healing " << c->getGivenName() << " the " << c->getCreatureName() << " by " << amnt << ". HP: " << initHP << " -> " << c->getHP() << "." << std::endl;
+ save(c, p);
+}
+
+
void reset(std::vector<std::string> args) {}
void set(std::vector<std::string> args) {}
void add(std::vector<std::string> args) {}
+const std::map<std::string, std::vector<int>> nargs({
+ {"cp", {2}},
+ {"mv", {2}},
+ {"damage", {2, 3}},
+ {"heal", {2}}
+ });
+
+void checkArgs(std::string cmd, std::vector<std::string> args) {
+ if(nargs.contains(cmd)) {
+ auto& allowed = nargs.at(cmd);
+ if(std::find(allowed.begin(), allowed.end(), args.size()) == allowed.end()) {
+ throw std::runtime_error("Subcommand '" + cmd + "' expected " + utils::join(allowed, ", ") + " arguments but got " + std::to_string(args.size()));
+ }
+ }
+}
+
int main(int argc, char *argv[]) {
std::string exename = argv[0];
std::vector<std::string> args(&argv[1], &argv[argc]);
@@ -241,6 +293,7 @@ int main(int argc, char *argv[]) {
std::vector<std::string> argsOrig(args);
args.erase(args.begin());
try {
+ checkArgs(cmd, args);
if(cmd == "ls") list(args);
else if(cmd == "cp") cp(args);
else if(cmd == "mkdir") mkdir(args);
diff --git a/src/rules.cc b/src/rules.cc
index a9ca395..15dcb34 100644
--- a/src/rules.cc
+++ b/src/rules.cc
@@ -30,4 +30,14 @@ namespace rules {
{"Performance", "cha"},
{"Persuasion", "cha"}
};
+
+ std::ostream& operator<<(std::ostream& os, const Ability& a) {
+ os << std::string(a);
+ return os;
+ }
+
+ std::ostream& operator<<(std::ostream& os, const Skill& s) {
+ os << std::string(s);
+ return os;
+ }
}
diff --git a/src/rules.h b/src/rules.h
index d49f17c..18cdef0 100644
--- a/src/rules.h
+++ b/src/rules.h
@@ -100,4 +100,7 @@ namespace rules {
static const std::map<std::string, std::string> skill2ability;
};
+
+ std::ostream& operator<<(std::ostream& os, const Ability& a);
+ std::ostream& operator<<(std::ostream& os, const Skill& s);
}
diff --git a/src/utils.h b/src/utils.h
index e44bdf2..2a66101 100644
--- a/src/utils.h
+++ b/src/utils.h
@@ -44,7 +44,7 @@ namespace utils {
template<typename Container> std::string join(Container parts, std::string joiner) {
std::stringstream out;
bool isFirst = true;
- for(std::string p : parts) {
+ for(auto p : parts) {
if(! isFirst) {
out << joiner;
}