#include "armor.h" #include "creature.h" #include "entry.h" #include "rules.h" #include #include using namespace std; namespace entry{ struct armorImpl { int ac; std::string armor_type; int strength; bool disadvantage; }; NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(armorImpl, ac, armor_type, strength, disadvantage); NLOHMANN_FRIEND_DEFS(Item, Armor, data); Armor::Armor() : data(new armorImpl()) {} int Armor::getACBonus(void) const {return data->ac;} std::string Armor::getArmorType(void) const {return data->armor_type;} int Armor::getStrRequirement(void) const {return data->strength;} bool Armor::stealthDisadvantage(void) const {return data->disadvantage;} string getTextHelper(const Armor& a, string dexBonusLight, string dexBonusMedium) { stringstream text; text << "AC: " << a.getACBonus(); if(a.getArmorType() == "light") { text << " + dex" << dexBonusLight; } else if(a.getArmorType() == "medium") { text << " + dex max 2" << dexBonusMedium; } if(a.getStrRequirement() > 0) { text << ", Mininum str: " << a.getStrRequirement(); } if(a.stealthDisadvantage()) { text << ", Imposes stealth disadvantage"; } text << ". " << a.getCostWeightText(); return text.str(); } string Armor::getText() const { return getTextHelper(*this, "", ""); } string Armor::getText(const creature::Creature& c) const { stringstream text; text << getName() << " (" << getType() << "): "; int dex = c.getBonus(rules::Ability::Dex()); string dexBonusLight = " (i.e., " + to_string(getACBonus() + dex) + ")"; string dexBonusMedium = " (i.e., " + to_string(getACBonus() + ((dex > 2)? 2 : dex)) + ")"; text << getTextHelper(*this, dexBonusLight, dexBonusMedium); return text.str(); } }