#pragma once #include "json.hpp" #include "jsonable.h" #include "rules.h" namespace entry { class Feature; } namespace entry { class Item; } class Armor; class Weapon; typedef nlohmann::json json; namespace creature { class dmgType : public Jsonable { public: dmgType(const json& data) : type(data["type"]), qualifiers(data["qualifiers"]) {} std::string type; std::vector qualifiers; json toJson(void) const { return json({ {"type", type}, {"qualifiers", qualifiers} }); } }; class Creature : public Jsonable { public: Creature(const json& data); virtual ~Creature() {}; // Getters int getSkillBonus(const rules::Skill& skill) const; int getAbilitySaveBonus(const rules::Ability& ability) const; std::map getSkills(void) const; std::map getSaves(void) const; // Inline getters std::string getCreatureName(void) const {return creatureName;} std::string getGivenName(void) const {return givenName;} std::string getType(void) const {return type;} std::string getSize(void) const {return size;} std::string getAlignment(void) const {return alignment;} double getCR(void) const {return cr;} std::pair getNaturalArmor(void) const {return {natArmorName, natArmorBonus};} std::string getLanguages(void) const {return langs;} int getHP(void) const {return hp;} int getHPMax(void) const {return hpMax;} std::vector getSenses(void) const {return senses;} std::string getSpeed(void) const {return speed;} int getScore(const rules::Ability& ability) const {return stats.at(ability);} int getBonus(const rules::Ability& ability) const {return (int) (getScore(ability) - 10) / 2;} int getProficiency(void) const {return proficiency;} std::vector> getFeatures(void) const {return features;} std::vector> getInventory(void) const {return inventory;} // Setters (mutators) void setGivenName(std::string name) {givenName = name;} void applyDamage(int amount, const std::string& type, const std::vector& qualifiers); void setScore(const rules::Ability& ability, int score); void setProfLevel(const rules::Skill& skill, int level); void addInventoryItem(std::shared_ptr item); void removeInventoryItem(const std::string& itemName); virtual json toJson(void) const; private: // Mutable variables std::string givenName; int hpMax; int hp; std::vector> inventory; std::map stats; std::map skills; //Immutable variables const std::string creatureName; const std::string size; const std::string type; const std::string alignment; const int hdCount; const int hdSides; const std::string speed; const std::vector saves; const std::vector senses; const std::string langs; const double cr; const int proficiency; const std::string natArmorName; const int natArmorBonus; const std::vector dmgImmunities; const std::vector dmgResistances; const std::vector dmgVulnerabilities; const std::vector condImmunities; const std::vector> features; }; // Convenience function to get any instances of T (subclass of Item) in the inventory template std::vector> getItems(const Creature& c) { std::vector> Ts; for(auto item : c.getInventory()) { std::shared_ptr t = dynamic_pointer_cast(item); if(t) { Ts.push_back(t); } } return Ts; } // Convenience function to calculate AC const int getAC(const Creature& c); // Convenience function to spit out everything about it std::string genText(const Creature& c); }