diff --git a/lib/spells/BattleSpellMechanics.cpp b/lib/spells/BattleSpellMechanics.cpp index c9d6b70b1..5ba490138 100644 --- a/lib/spells/BattleSpellMechanics.cpp +++ b/lib/spells/BattleSpellMechanics.cpp @@ -505,62 +505,14 @@ std::set BattleSpellMechanics::spellRangeInHexes(BattleHex centralHex using namespace SRSLPraserHelpers; std::set ret; - std::string rng = owner->getLevelInfo(getRangeLevel()).range + ','; //copy + artificial comma for easier handling + std::vector rng = owner->getLevelInfo(getRangeLevel()).range; - if(rng.size() >= 2 && rng[0] != 'X') //there is at least one hex in range (+artificial comma) + for(auto & elem : rng) { - std::string number1; - std::string number2; - int beg = 0; - int end = 0; - bool readingFirst = true; - for(auto & elem : rng) - { - if(std::isdigit(elem) ) //reading number - { - if(readingFirst) - number1 += elem; - else - number2 += elem; - } - else if(elem == ',') //comma - { - //calculating variables - if(readingFirst) - { - beg = std::stoi(number1); - number1 = ""; - } - else - { - end = std::stoi(number2); - number2 = ""; - } - //obtaining new hexes - std::set curLayer; - if(readingFirst) - { - curLayer = getInRange(centralHex, beg, beg); - } - else - { - curLayer = getInRange(centralHex, beg, end); - readingFirst = true; - } - //adding obtained hexes - for(const auto & curLayer_it : curLayer) - { - ret.insert(curLayer_it); - } - - } - else if(elem == '-') //dash - { - beg = std::stoi(number1); - number1 = ""; - readingFirst = false; - } - } + std::set curLayer = getInRange(centralHex, elem, elem); + //adding obtained hexes + for(const auto & curLayer_it : curLayer) + ret.insert(curLayer_it); } return ret; diff --git a/lib/spells/CSpellHandler.cpp b/lib/spells/CSpellHandler.cpp index e6cb76f33..5016bff6b 100644 --- a/lib/spells/CSpellHandler.cpp +++ b/lib/spells/CSpellHandler.cpp @@ -557,7 +557,7 @@ CSpell::TargetInfo::TargetInfo(const CSpell * spell, const int level, spells::Mo const auto & levelInfo = spell->getLevelInfo(level); smart = levelInfo.smartTarget; - massive = levelInfo.range == "X"; + massive = levelInfo.range.empty(); clearAffected = levelInfo.clearAffected; clearTarget = levelInfo.clearTarget; } @@ -677,6 +677,64 @@ const std::vector & CSpellHandler::getTypeNames() const return typeNames; } +std::vector CSpellHandler::spellRangeInHexes(std::string input) const +{ + std::set ret; + std::string rng = input + ','; //copy + artificial comma for easier handling + + if(rng.size() >= 2 && rng[0] != 'X') //there is at least one hex in range (+artificial comma) + { + std::string number1; + std::string number2; + int beg = 0; + int end = 0; + bool readingFirst = true; + for(auto & elem : rng) + { + if(std::isdigit(elem) ) //reading number + { + if(readingFirst) + number1 += elem; + else + number2 += elem; + } + else if(elem == ',') //comma + { + //calculating variables + if(readingFirst) + { + beg = std::stoi(number1); + number1 = ""; + } + else + { + end = std::stoi(number2); + number2 = ""; + } + //obtaining new hexes + std::set curLayer; + if(readingFirst) + { + ret.insert(beg); + } + else + { + for(int i = beg; i <= end; ++i) + ret.insert(i); + } + } + else if(elem == '-') //dash + { + beg = std::stoi(number1); + number1 = ""; + readingFirst = false; + } + } + } + + return std::vector(ret.begin(), ret.end()); +} + std::shared_ptr CSpellHandler::loadFromJson(const std::string & scope, const JsonNode & json, const std::string & identifier, size_t index) { assert(identifier.find(':') == std::string::npos); @@ -931,7 +989,7 @@ std::shared_ptr CSpellHandler::loadFromJson(const std::string & scope, c levelObject.smartTarget = levelNode["targetModifier"]["smart"].Bool(); levelObject.clearTarget = levelNode["targetModifier"]["clearTarget"].Bool(); levelObject.clearAffected = levelNode["targetModifier"]["clearAffected"].Bool(); - levelObject.range = levelNode["range"].String(); + levelObject.range = spellRangeInHexes(levelNode["range"].String()); for(const auto & elem : levelNode["effects"].Struct()) { diff --git a/lib/spells/CSpellHandler.h b/lib/spells/CSpellHandler.h index f275c8656..5d3763238 100644 --- a/lib/spells/CSpellHandler.h +++ b/lib/spells/CSpellHandler.h @@ -110,7 +110,7 @@ public: bool smartTarget = true; bool clearTarget = false; bool clearAffected = false; - std::string range = "0"; + std::vector range = { 0 }; //TODO: remove these two when AI will understand special effects std::vector> effects; //deprecated @@ -305,6 +305,8 @@ bool DLL_LINKAGE isInScreenRange(const int3 ¢er, const int3 &pos); //for spe class DLL_LINKAGE CSpellHandler: public CHandlerBase { + std::vector spellRangeInHexes(std::string rng) const; + public: ///IHandler base std::vector loadLegacyData() override;