mirror of
https://github.com/vcmi/vcmi.git
synced 2025-03-19 21:10:12 +02:00
Parse spell range on load instead of on every cast attempt
This commit is contained in:
parent
a3b2c49c79
commit
a4fa409d1f
@ -505,62 +505,14 @@ std::set<BattleHex> BattleSpellMechanics::spellRangeInHexes(BattleHex centralHex
|
|||||||
using namespace SRSLPraserHelpers;
|
using namespace SRSLPraserHelpers;
|
||||||
|
|
||||||
std::set<BattleHex> ret;
|
std::set<BattleHex> ret;
|
||||||
std::string rng = owner->getLevelInfo(getRangeLevel()).range + ','; //copy + artificial comma for easier handling
|
std::vector<int> 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::set<ui16> curLayer = getInRange(centralHex, elem, elem);
|
||||||
std::string number2;
|
//adding obtained hexes
|
||||||
int beg = 0;
|
for(const auto & curLayer_it : curLayer)
|
||||||
int end = 0;
|
ret.insert(curLayer_it);
|
||||||
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<ui16> 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -557,7 +557,7 @@ CSpell::TargetInfo::TargetInfo(const CSpell * spell, const int level, spells::Mo
|
|||||||
const auto & levelInfo = spell->getLevelInfo(level);
|
const auto & levelInfo = spell->getLevelInfo(level);
|
||||||
|
|
||||||
smart = levelInfo.smartTarget;
|
smart = levelInfo.smartTarget;
|
||||||
massive = levelInfo.range == "X";
|
massive = levelInfo.range.empty();
|
||||||
clearAffected = levelInfo.clearAffected;
|
clearAffected = levelInfo.clearAffected;
|
||||||
clearTarget = levelInfo.clearTarget;
|
clearTarget = levelInfo.clearTarget;
|
||||||
}
|
}
|
||||||
@ -677,6 +677,64 @@ const std::vector<std::string> & CSpellHandler::getTypeNames() const
|
|||||||
return typeNames;
|
return typeNames;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<int> CSpellHandler::spellRangeInHexes(std::string input) const
|
||||||
|
{
|
||||||
|
std::set<BattleHex> 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<ui16> 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<int>(ret.begin(), ret.end());
|
||||||
|
}
|
||||||
|
|
||||||
std::shared_ptr<CSpell> CSpellHandler::loadFromJson(const std::string & scope, const JsonNode & json, const std::string & identifier, size_t index)
|
std::shared_ptr<CSpell> CSpellHandler::loadFromJson(const std::string & scope, const JsonNode & json, const std::string & identifier, size_t index)
|
||||||
{
|
{
|
||||||
assert(identifier.find(':') == std::string::npos);
|
assert(identifier.find(':') == std::string::npos);
|
||||||
@ -931,7 +989,7 @@ std::shared_ptr<CSpell> CSpellHandler::loadFromJson(const std::string & scope, c
|
|||||||
levelObject.smartTarget = levelNode["targetModifier"]["smart"].Bool();
|
levelObject.smartTarget = levelNode["targetModifier"]["smart"].Bool();
|
||||||
levelObject.clearTarget = levelNode["targetModifier"]["clearTarget"].Bool();
|
levelObject.clearTarget = levelNode["targetModifier"]["clearTarget"].Bool();
|
||||||
levelObject.clearAffected = levelNode["targetModifier"]["clearAffected"].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())
|
for(const auto & elem : levelNode["effects"].Struct())
|
||||||
{
|
{
|
||||||
|
@ -110,7 +110,7 @@ public:
|
|||||||
bool smartTarget = true;
|
bool smartTarget = true;
|
||||||
bool clearTarget = false;
|
bool clearTarget = false;
|
||||||
bool clearAffected = false;
|
bool clearAffected = false;
|
||||||
std::string range = "0";
|
std::vector<int> range = { 0 };
|
||||||
|
|
||||||
//TODO: remove these two when AI will understand special effects
|
//TODO: remove these two when AI will understand special effects
|
||||||
std::vector<std::shared_ptr<Bonus>> effects; //deprecated
|
std::vector<std::shared_ptr<Bonus>> effects; //deprecated
|
||||||
@ -305,6 +305,8 @@ bool DLL_LINKAGE isInScreenRange(const int3 ¢er, const int3 &pos); //for spe
|
|||||||
|
|
||||||
class DLL_LINKAGE CSpellHandler: public CHandlerBase<SpellID, spells::Spell, CSpell, spells::Service>
|
class DLL_LINKAGE CSpellHandler: public CHandlerBase<SpellID, spells::Spell, CSpell, spells::Service>
|
||||||
{
|
{
|
||||||
|
std::vector<int> spellRangeInHexes(std::string rng) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
///IHandler base
|
///IHandler base
|
||||||
std::vector<JsonNode> loadLegacyData() override;
|
std::vector<JsonNode> loadLegacyData() override;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user