aboutsummaryrefslogtreecommitdiff
path: root/src/rules.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/rules.h')
-rw-r--r--src/rules.h49
1 files changed, 25 insertions, 24 deletions
diff --git a/src/rules.h b/src/rules.h
index c1b130d..83d471f 100644
--- a/src/rules.h
+++ b/src/rules.h
@@ -10,23 +10,34 @@
namespace rules {
- class Ability : public Jsonable {
+ class RuleItem {
+ public:
+ friend void to_json(nlohmann::json& j, const RuleItem& ri) {
+ j = ri.payload;
+ }
+ friend void from_json(const nlohmann::json& j, RuleItem& ri) {
+ ri.payload = j;
+ }
+ std::string getPayload(void) const {return payload;}
+ protected:
+ std::string payload;
+ };
+
+ class Ability : public RuleItem {
public:
std::string getFull() const {return abilities.at(getAbbrev());}
- std::string getAbbrev() const {return abbrev;}
+ std::string getAbbrev() const {return getPayload();}
operator std::string() const {return getAbbrev();}
- 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();}
operator bool() const {return ! getAbbrev().empty();}
Ability() {}
- explicit Ability(const nlohmann::json& data) : abbrev(data) {
+ Ability(const std::string& abbrev) {
if(! abilities.contains(abbrev)) {
throw std::invalid_argument("No such ability: " + abbrev);
}
+ payload = abbrev;
}
virtual ~Ability() {}
@@ -50,19 +61,14 @@ namespace rules {
}
private:
- const std::string abbrev;
-
static const std::map<std::string, std::string> abilities;
};
- class Skill : public Jsonable {
+ class Skill : public RuleItem {
public:
- std::string getName() const {return name;}
+ std::string getName() const {return getPayload();}
Ability getAbility() const {return Ability(skill2ability.at(getName()));}
operator std::string() const {return 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();}
operator bool() const {return ! getName().empty();}
@@ -89,10 +95,11 @@ namespace rules {
static Skill Persuasion() {return Skill("Persuasion");}
Skill() {};
- explicit Skill(const nlohmann::json& data) : name(data) {
+ Skill(const std::string& name) {
if(! skill2ability.contains(name)) {
throw std::invalid_argument("No such skill: " + name);
}
+ payload = name;
}
static Skill fromString(std::string s) {
@@ -108,25 +115,21 @@ namespace rules {
}
private:
- const std::string name;
-
static const std::map<std::string, std::string> skill2ability;
};
- class Qualifier : public Jsonable {
+ class Qualifier : public RuleItem {
public:
Qualifier() {}
- Qualifier(const nlohmann::json& data) : negative(data) {
+ Qualifier(const std::string& negative) {
if(! negative2positive.contains(negative)) {
throw std::invalid_argument("No such qualifier: " + negative);
}
+ payload = negative;
}
- std::string getNegative() const {return negative;}
+ std::string getNegative() const {return getPayload();}
std::string getPositive() const {return negative2positive.at(getNegative());}
operator std::string() const {return getNegative();}
- virtual nlohmann::json toJson(void) const {
- return getNegative();
- }
virtual ~Qualifier() {}
bool operator==(const Qualifier& rhs) const {return getNegative() == rhs.getNegative();}
@@ -135,8 +138,6 @@ namespace rules {
static Qualifier Adamantine() {return Qualifier("non-adamantine");}
private:
- const std::string negative;
-
static const std::map<std::string, std::string> negative2positive;
};