aboutsummaryrefslogtreecommitdiff
path: root/src/creature.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/creature.cc')
-rw-r--r--src/creature.cc99
1 files changed, 55 insertions, 44 deletions
diff --git a/src/creature.cc b/src/creature.cc
index ac616ac..ee735d7 100644
--- a/src/creature.cc
+++ b/src/creature.cc
@@ -15,19 +15,16 @@ using namespace std;
namespace creature {
template<typename T> map<T, int> makeMap(map<string, int> src) {
- //cout << "Got here!\n";
map<T, int> ret;
for(auto& [abilityStr, val] : src) {
ret.insert({T(abilityStr), val});
}
- //cout << "And here!\n";
return ret;
}
- Creature::Creature(const json& data)
- : inventory(json2ptrvec<entry::Item>(data["inventory"])), stats(makeMap<rules::Ability>(data["stats"])), skills(makeMap<rules::Skill>(data["skills"])), creatureName(data["name"]), size(data["size"]), type(data["type"]), alignment(data["alignment"]), hdCount(data["hit_die_count"]), hdSides(data["hit_die_sides"]), speed(data["speed"]), saves(json2vec<rules::Ability>(data["saves"])), langs(data["langs"]), cr(data["cr"]), proficiency(data["prof"]), natArmorName(data["natural_armor"]["name"]), natArmorBonus(data["natural_armor"]["bonus"]), dmgImmunities(json2vec<dmgType>(data["d_immunities"])), dmgResistances(json2vec<dmgType>(data["d_resistances"])), dmgVulnerabilities(json2vec<dmgType>(data["d_vulnerabilities"])), condImmunities(json2vec<dmgType>(data["c_immunities"])), features(json2ptrvec<entry::Feature>(data["features"]))
+ Creature::Creature(const json& data, const json& base)
+ : Entry(base), inventory(json2ptrvec<entry::Item>(data["inventory"])), stats(makeMap<rules::Ability>(data["stats"])), skills(makeMap<rules::Skill>(data["skills"])), size(data["size"]), alignment(data["alignment"]), hdCount(data["hit_die_count"]), hdSides(data["hit_die_sides"]), speed(data["speed"]), saves(json2vec<rules::Ability>(data["saves"])), langs(data["langs"]), cr(data["cr"]), proficiency(data["prof"]), natArmorName(data["natural_armor"]["name"]), natArmorBonus(data["natural_armor"]["bonus"]), dmgImmunities(json2vec<dmgType>(data["d_immunities"])), dmgResistances(json2vec<dmgType>(data["d_resistances"])), dmgVulnerabilities(json2vec<dmgType>(data["d_vulnerabilities"])), condImmunities(json2vec<dmgType>(data["c_immunities"])), features(json2ptrvec<entry::Feature>(data["features"]))
{
- //cout << "...And here!\n";
// Initialize names and hp
if(((map<string, json>) data).contains("givenName")) {
givenName = data["givenName"];
@@ -52,30 +49,28 @@ namespace creature {
}
nlohmann::json Creature::toJson() const {
- return nlohmann::json({
- {"name", creatureName},
- {"size", size},
- {"type", type},
- {"alignment", alignment},
- {"hit_die_count", hdCount},
- {"hit_die_sides", hdSides},
- {"speed", speed},
- {"stats", stats},
- {"skills", skills},
- {"saves", saves},
- {"langs", langs},
- {"cr", cr},
- {"prof", proficiency},
- {"d_immunities", dmgImmunities},
- {"d_resistances", dmgResistances},
- {"d_vulnerabilities", dmgVulnerabilities},
- {"c_immunities", condImmunities},
- {"givenName", givenName},
- {"hpMax", hpMax},
- {"hp", hp},
- {"inventory", getJsonVectP(inventory)},
- {"features", getJsonVectP(features)}
- });
+ nlohmann::json data = Entry::toJson();
+ data["size"] = size;
+ data["alignment"] = alignment;
+ data["hit_die_count"] = hdCount;
+ data["hit_die_sides"] = hdSides;
+ data["speed"] = speed;
+ data["stats"] = stats;
+ data["skills"] = skills;
+ data["saves"] = saves;
+ data["langs"] = langs;
+ data["cr"] = cr;
+ data["prof"] = proficiency;
+ data["d_immunities"] = dmgImmunities;
+ data["d_resistances"] = dmgResistances;
+ data["d_vulnerabilities"] = dmgVulnerabilities;
+ data["c_immunities"] = condImmunities;
+ data["givenName"] = givenName;
+ data["hpMax"] = hpMax;
+ data["hp"] = hp;
+ data["inventory"] = getJsonVectP(inventory);
+ data["features"] = getJsonVectP(features);
+ return data;
}
// True if type without matching qualifiers is in subdata
@@ -194,6 +189,10 @@ namespace creature {
return out;
}
+ string formatDmgTypeVector(string title, vector<dmgType> dmg) {
+ return title + ": " + utils::join(dmg, "; ");
+ }
+
string genText(const Creature& c) {
stringstream text;
text << c.getGivenName() << " (" << c.getCreatureName() << "): " << c.getHP() << "/" << c.getHPMax() << " hp, " << getAC(c) << " ac";
@@ -205,49 +204,61 @@ namespace creature {
text << " (" << armor << ")";
}
}
- text << ", speed " << c.getSpeed() << "\n";
- text << "A cr " << c.getCR() << " " << c.getAlignment() << " " << c.getSize() << " " << c.getType() << ".\n";
- text << "Stats:\n";
+ text << ", speed " << c.getSpeed() << endl;
+ text << "A cr " << c.getCR() << " " << c.getAlignment() << " " << c.getSize() << " " << c.getType() << "." << endl;
+ text << "Stats:" << endl;
using namespace rules;
vector<rules::Ability> abilities {Ability::Str(), Ability::Dex(), Ability::Con(), Ability::Int(), Ability::Wis(), Ability::Cha()};
for(auto ability : abilities) {
text << " " << setw(6) << std::left << ability.getAbbrev();
}
- text << "\n";
+ text << endl;
for(auto ability : abilities) {
text << setw(7) << std::left << (to_string(c.getScore(ability)) + "(" + to_string(c.getBonus(ability)) + ")");
}
- text << "\n";
+ text << endl;
text << "Senses: ";
if(! c.getSenses().empty()) {
text << utils::join(c.getSenses(), ", ") << ". ";
}
- text << "Passive Perception " << 10 + c.getSkillBonus(rules::Skill::Perception()) << "\n";
+ text << "Passive Perception " << 10 + c.getSkillBonus(rules::Skill::Perception()) << endl;
if(! c.getLanguages().empty()) {
- text << "Languages: " << c.getLanguages() << "\n";
+ text << "Languages: " << c.getLanguages() << endl;
}
if(! c.getSkills().empty()) {
- text << "\nSkills:\n";
+ text << endl << "Skills:" << endl;
for(auto skill : c.getSkills()) {
- text << skill.first.getName() << " (+" << skill.second << ")\n";
+ text << " * " << skill.first.getName() << " (+" << skill.second << ")" << endl;
}
}
if(! c.getSaves().empty()) {
- text << "\nSaves:\n";
+ text << endl << "Saves:" << endl;
for(auto save : c.getSaves()) {
- text << save.first.getAbbrev() << " (+" << save.second << ")\n";
+ text << " * " << save.first.getAbbrev() << " (+" << save.second << ")" << endl;
}
}
+ if(! c.getDmgImmunities().empty()) {
+ text << formatDmgTypeVector("\nDamage Immunities", c.getDmgImmunities()) << endl;
+ }
+ if(! c.getDmgResistances().empty()) {
+ text << formatDmgTypeVector("\nDamage Resistances", c.getDmgResistances()) << endl;
+ }
+ if(! c.getDmgVulnerabilities().empty()) {
+ text << formatDmgTypeVector("\nDamage Vulnerabilities", c.getDmgVulnerabilities()) << endl;
+ }
+ if(! c.getCondImmunities().empty()) {
+ text << formatDmgTypeVector("\nCondition Immunities", c.getCondImmunities()) << endl;
+ }
if(! c.getFeatures().empty()) {
- text << "\nFeatures:\n";
+ text << endl << "Features:" << endl;
for(auto f: c.getFeatures()) {
- text << f->getText(c) << "\n";
+ text << " * " << f->getText(c) << endl;
}
}
if(! c.getInventory().empty()) {
- text << "\nInventory:\n";
+ text << endl << "Inventory:" << endl;
for(auto i : c.getInventory()) {
- text << i->getText(c) << "\n";
+ text << " * " << i->getText(c) << endl;
}
}