Code: Select all
//======================================================================
//======================================================================
const std::map<Skill::Type,std::string> Skill::SKILL_TYPE_NAMES {
{Skill::Type::ALCHEMY,"alchemy"s},{Skill::Type::ANATOMY,"anatomy"s},
{Skill::Type::ANIMALLORE,"animallore"s},{Skill::Type::ITEMID,"itemid"s},
{Skill::Type::ARMSLORE,"armslore"s},{Skill::Type::PARRYING,"parrying"s},
{Skill::Type::BEGGING,"begging"s},{Skill::Type::BLACKSMITHING,"blacksmithing"s},
{Skill::Type::BOWCRAFT,"bowcraft"s},{Skill::Type::PEACEMAKING,"peacemaking"s},
{Skill::Type::CAMPING,"camping"s},{Skill::Type::CARPENTRY,"carpentry"s},
{Skill::Type::CARTOGRAPHY,"cartography"s},{Skill::Type::COOKING,"cooking"s},
{Skill::Type::DETECTINGHIDDEN,"detectinghidden"s},{Skill::Type::ENTICEMENT,"enticement"s},
{Skill::Type::EVALUATINGINTEL,"evalutingintel"s},{Skill::Type::HEALING,"healing"s},
{Skill::Type::FISHING,"fishing"s},{Skill::Type::FORENSICS,"forensics"s},
{Skill::Type::HERDING,"herding"s},{Skill::Type::HIDING,"hiding"s},
{Skill::Type::PROVOCATION,"provocation"s},{Skill::Type::MAGERY,"magery"s},
{Skill::Type::LOCKPICKING,"lockpicking"s},{Skill::Type::INSCRIPTION,"inscription"s},
{Skill::Type::MAGICRESISTANCE,"magicresistance"s},{Skill::Type::TACTICS,"tatics"s},
{Skill::Type::SNOOPING,"snooping"s},{Skill::Type::MUSICIANSHIP,"musicianship"s},
{Skill::Type::POISONING,"poisoning"s},{Skill::Type::ARCHERY,"archery"s},
{Skill::Type::SPIRITSPEAK,"spiritspeak"s},{Skill::Type::STEALING,"stealing"s},
{Skill::Type::TAILORING,"tailoring"s},{Skill::Type::TAMING,"taming"s},
{Skill::Type::TASTEID,"tasteid"s},{Skill::Type::TINKERING,"tinkering"s},
{Skill::Type::TRACKING,"tracking"s},{Skill::Type::VETERINARY,"veterinary"s},
{Skill::Type::SWORDSMANSHIP,"swordmanship"s},{Skill::Type::MACEFIGHTING,"macefighting"s},
{Skill::Type::FENCING,"fencing"s},{Skill::Type::WRESTLING,"wrestling"s},
{Skill::Type::LUMBERJACKING,"lumberjacking"s},{Skill::Type::MINING,"mining"s},
{Skill::Type::MEDITATION,"meditation"s},{Skill::Type::STEALTH,"stealth"s},
{Skill::Type::REMOVETRAP,"removetrap"s},{Skill::Type::NECROMANCY,"necromancy"s},
{Skill::Type::FOCUS,"focus"s},{Skill::Type::CHIVALRY,"chivalry"s},
{Skill::Type::BUSHIDO,"bushido"s},{Skill::Type::NINJITSU,"ninjitsu"s},
{Skill::Type::SPELLWEAVING,"spellweaving"s},{Skill::Type::IMBUING,"imbuing"s},
{Skill::Type::MYSTICISM,"mysticism"s},{Skill::Type::THROWING,"throwing"s}
};
//======================================================================
const std::map<Skill::Type,std::string> Skill::MAKEWORD_FOR_SKILL {
{Skill::Type::ALCHEMY,"mixed"s},{Skill::Type::BLACKSMITHING,"forged"s},
{Skill::Type::BOWCRAFT,"bowcraft"s},{Skill::Type::CARTOGRAPHY,"written"s},
{Skill::Type::COOKING,"cooked"s},{Skill::Type::MAGERY,"envoked"s},
{Skill::Type::INSCRIPTION,"written"s},{Skill::Type::TAILORING,"sewn"s},
{Skill::Type::MINING,"smelted"s},{Skill::Type::MEDITATION,"envoked"s}
};
//======================================================================
const std::map<Skill::Type,int> Skill::DELAY_FOR_SKILL {
{Skill::Type::BEGGING,0},{Skill::Type::PEACEMAKING,5},
{Skill::Type::HERDING,10},{Skill::Type::HIDING,10},
{Skill::Type::PROVOCATION,10},{Skill::Type::POISONING,10},
{Skill::Type::STEALING,10},{Skill::Type::TAMING,0},
{Skill::Type::TRACKING,10},{Skill::Type::VETERINARY,0},
{Skill::Type::MEDITATION,10},{Skill::Type::STEALTH,10},
{Skill::Type::REMOVETRAP,10}
};
//======================================================================
const std::string Skill::EMPTY_STRING = std::string() ;
//======================================================================
std::vector<SkillAdvancement> Skill::advancement = std::vector<SkillAdvancement>() ;
//======================================================================
auto Skill::nameForType(Skill::Type type) -> const std::string &{
return SKILL_TYPE_NAMES.at(type) ;
}
//======================================================================
auto Skill::typeForName(const std::string &name) -> Skill::Type{
auto lname = util::lower(name) ;
auto iter = std::find_if(SKILL_TYPE_NAMES.begin(),SKILL_TYPE_NAMES.end(),[&lname](const std::pair<Skill::Type,std::string> &entry){
return entry.second == lname ;
});
if (iter != SKILL_TYPE_NAMES.end()){
return iter->first ;
}
throw std::runtime_error("Unknown skill type name: "s+name);
}
//======================================================================
auto Skill::makeWordForSkill(Skill::Type type) -> const std::string& {
auto iter = MAKEWORD_FOR_SKILL.find(type) ;
if (iter != MAKEWORD_FOR_SKILL.end()){
return iter->second;
}
return EMPTY_STRING ;
}
//======================================================================
auto Skill::delayForSkill(Skill::Type type) -> int {
auto iter = DELAY_FOR_SKILL.find(type) ;
if (iter != DELAY_FOR_SKILL.end()){
return iter->second;
}
return DEFAULT_SKILL_DELAY ;
}
//======================================================================
auto Skill::loadAdvancement(const std::filesystem::path &path) -> void {
auto input = std::ifstream(path.string()) ;
if (input.is_open()){
auto size = static_cast<int>(SKILL_TYPE_NAMES.rbegin()->first) + 1;
advancement = std::vector<SkillAdvancement>(size) ;
auto buffer = std::vector<char>(4096,0) ;
auto type = Skill::Type::ANATOMY ;
auto advance =std::vector<AdvancementEntry>() ;
auto attributes = Attribute() ;
while (input.good() && !input.eof()) {
input.getline(buffer.data(),buffer.size()-1);
if (input.gcount()>0) {
buffer[input.gcount()] = 0 ;
std::string line = buffer.data() ;
line = util::trim(util::strip(line,"//")) ;
if (!line.empty()){
if (line[0]=='['){
auto [sectype,sec] = util::split(util::contentsOf(line, "[", "]"),":");
if (util::lower(sec) == "advancement"){
type = typeForName(util::lower(sectype));
}
}
else if (line[0]=='}') {
advancement.at(type)= SkillAdvancement(attributes,advance);
advance = std::vector<AdvancementEntry>();
attributes = Attribute() ;
}
else if (line[0]!= '{'){
auto [key,value] = util::split(line,"=");
if (util::lower(key) == "advance"){
advance.push_back(AdvancementEntry(value)) ;
}
else if (util::lower(key) == "attribute"){
attributes = Attribute(value) ;
}
}
}
}
}
}
}
//======================================================================
Skill::Skill(){
auto size = static_cast<int>(SKILL_TYPE_NAMES.rbegin()->first) + 1 ;
skills = std::vector<RangeValue>(size) ;
}