#pragma once #include "jsonable.h" #include #include #include #include using namespace std; namespace rules { class Ability : public Jsonable { public: string getFull() const {return abilities.at(getAbbrev());} string getAbbrev() const {return abbrev;} virtual nlohmann::json toJson(void) const { return getAbbrev(); } bool operator<(const Ability& rhs) const {return getAbbrev() < rhs.getAbbrev();} bool operator==(const Ability& rhs) const {return getAbbrev() == rhs.getAbbrev();} Ability() {} explicit Ability(const nlohmann::json& data) : abbrev(data) {} virtual ~Ability() {} static Ability Str() {return Ability("str");} static Ability Dex() {return Ability("dex");} static Ability Con() {return Ability("con");} static Ability Int() {return Ability("int");} static Ability Wis() {return Ability("wis");} static Ability Cha() {return Ability("cha");} private: const string abbrev; const map abilities { {"str", "Strength"}, {"dex", "Dexterity"}, {"con", "Constitution"}, {"int", "Intelligence"}, {"wis", "Wisdom"}, {"cha", "Charisma"} }; }; class Skill : public Jsonable { public: string getName() const {return name;} Ability getAbility() const {return Ability(skill2ability.at(getName()));} virtual nlohmann::json toJson(void) const { return getName(); } bool operator<(const Skill& rhs) const {return getName() < rhs.getName();} bool operator==(const Skill& rhs) const {return getName() == rhs.getName();} virtual ~Skill() {} static Skill Athletics() {return Skill("Athletics");} static Skill Acrobatics() {return Skill("Acrobatics");} static Skill SleightOfHand() {return Skill("Sleight of Hand");} static Skill Stealth() {return Skill("Stealth");} static Skill Arcana() {return Skill("Arcana");} static Skill History() {return Skill("History");} static Skill Investigation() {return Skill("Investigation");} static Skill Nature() {return Skill("Nature");} static Skill Religion() {return Skill("Religion");} static Skill AnimalHandling() {return Skill("Animal Handling");} static Skill Insight() {return Skill("Insight");} static Skill Medicine() {return Skill("Medicine");} static Skill Perception() {return Skill("Perception");} static Skill Survival() {return Skill("Survival");} static Skill Deception() {return Skill("Deception");} static Skill Intimidation() {return Skill("Intimidation");} static Skill Performance() {return Skill("Performance");} static Skill Persuasion() {return Skill("Persuasion");} explicit Skill(const nlohmann::json& data) : name(data) {} private: const string name; const map skill2ability { {"Athletics", "str"}, {"Acrobatics", "dex"}, {"Sleight of Hand", "dex"}, {"Stealth", "dex"}, {"Arcana", "int"}, {"History", "int"}, {"Investigation", "int"}, {"Nature", "int"}, {"Religion", "int"}, {"Animal Handling", "wis"}, {"Insight", "wis"}, {"Medicine", "wis"}, {"Perception", "wis"}, {"Survival", "wis"}, {"Deception", "cha"}, {"Intimidation", "cha"}, {"Performance", "cha"}, {"Persuasion", "cha"} }; }; }