mirror of
https://github.com/vcmi/vcmi.git
synced 2025-07-17 01:32:21 +02:00
Avoid vector allocation when accessing game settings value
This commit is contained in:
@ -85,8 +85,8 @@ int AFactionMember::getPrimSkillLevel(PrimarySkill id) const
|
|||||||
static const CSelector selectorAllSkills = Selector::type()(BonusType::PRIMARY_SKILL);
|
static const CSelector selectorAllSkills = Selector::type()(BonusType::PRIMARY_SKILL);
|
||||||
static const std::string keyAllSkills = "type_PRIMARY_SKILL";
|
static const std::string keyAllSkills = "type_PRIMARY_SKILL";
|
||||||
auto allSkills = getBonusBearer()->getBonuses(selectorAllSkills, keyAllSkills);
|
auto allSkills = getBonusBearer()->getBonuses(selectorAllSkills, keyAllSkills);
|
||||||
auto ret = allSkills->valOfBonuses(Selector::subtype()(BonusSubtypeID(id)));
|
int ret = allSkills->valOfBonuses(Selector::subtype()(BonusSubtypeID(id)));
|
||||||
auto minSkillValue = VLC->engineSettings()->getVector(EGameSettings::HEROES_MINIMAL_PRIMARY_SKILLS)[id.getNum()];
|
int minSkillValue = VLC->engineSettings()->getVectorValue(EGameSettings::HEROES_MINIMAL_PRIMARY_SKILLS, id.getNum());
|
||||||
return std::max(ret, minSkillValue); //otherwise, some artifacts may cause negative skill value effect, sp=0 works in old saves
|
return std::max(ret, minSkillValue); //otherwise, some artifacts may cause negative skill value effect, sp=0 works in old saves
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,6 +33,11 @@ std::vector<int> IGameSettings::getVector(EGameSettings option) const
|
|||||||
return getValue(option).convertTo<std::vector<int>>();
|
return getValue(option).convertTo<std::vector<int>>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int IGameSettings::getVectorValue(EGameSettings option, size_t index) const
|
||||||
|
{
|
||||||
|
return getValue(option)[index].Integer();
|
||||||
|
}
|
||||||
|
|
||||||
GameSettings::GameSettings() = default;
|
GameSettings::GameSettings() = default;
|
||||||
GameSettings::~GameSettings() = default;
|
GameSettings::~GameSettings() = default;
|
||||||
|
|
||||||
|
@ -101,6 +101,7 @@ public:
|
|||||||
int64_t getInteger(EGameSettings option) const;
|
int64_t getInteger(EGameSettings option) const;
|
||||||
double getDouble(EGameSettings option) const;
|
double getDouble(EGameSettings option) const;
|
||||||
std::vector<int> getVector(EGameSettings option) const;
|
std::vector<int> getVector(EGameSettings option) const;
|
||||||
|
int getVectorValue(EGameSettings option, size_t index) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
VCMI_LIB_NAMESPACE_END
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
@ -32,7 +32,7 @@ void CHeroClassHandler::fillPrimarySkillData(const JsonNode & node, CHeroClass *
|
|||||||
{
|
{
|
||||||
const auto & skillName = NPrimarySkill::names[pSkill.getNum()];
|
const auto & skillName = NPrimarySkill::names[pSkill.getNum()];
|
||||||
auto currentPrimarySkillValue = static_cast<int>(node["primarySkills"][skillName].Integer());
|
auto currentPrimarySkillValue = static_cast<int>(node["primarySkills"][skillName].Integer());
|
||||||
int primarySkillLegalMinimum = VLC->engineSettings()->getVector(EGameSettings::HEROES_MINIMAL_PRIMARY_SKILLS)[pSkill.getNum()];
|
int primarySkillLegalMinimum = VLC->engineSettings()->getVectorValue(EGameSettings::HEROES_MINIMAL_PRIMARY_SKILLS, pSkill.getNum());
|
||||||
|
|
||||||
if(currentPrimarySkillValue < primarySkillLegalMinimum)
|
if(currentPrimarySkillValue < primarySkillLegalMinimum)
|
||||||
{
|
{
|
||||||
|
@ -1923,7 +1923,7 @@ int CGHeroInstance::getBasePrimarySkillValue(PrimarySkill which) const
|
|||||||
{
|
{
|
||||||
std::string cachingStr = "type_PRIMARY_SKILL_base_" + std::to_string(static_cast<int>(which));
|
std::string cachingStr = "type_PRIMARY_SKILL_base_" + std::to_string(static_cast<int>(which));
|
||||||
auto selector = Selector::typeSubtype(BonusType::PRIMARY_SKILL, BonusSubtypeID(which)).And(Selector::sourceType()(BonusSource::HERO_BASE_SKILL));
|
auto selector = Selector::typeSubtype(BonusType::PRIMARY_SKILL, BonusSubtypeID(which)).And(Selector::sourceType()(BonusSource::HERO_BASE_SKILL));
|
||||||
auto minSkillValue = VLC->engineSettings()->getVector(EGameSettings::HEROES_MINIMAL_PRIMARY_SKILLS)[which.getNum()];
|
auto minSkillValue = VLC->engineSettings()->getVectorValue(EGameSettings::HEROES_MINIMAL_PRIMARY_SKILLS, which.getNum());
|
||||||
return std::max(valOfBonuses(selector, cachingStr), minSkillValue);
|
return std::max(valOfBonuses(selector, cachingStr), minSkillValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user