1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-09-16 09:26:28 +02:00

Merge pull request #4400 from kdmcser/support_0_spellpower_and_knowledge

support configure for minimal primary skill values
This commit is contained in:
Ivan Savenko
2024-08-12 17:16:46 +03:00
committed by GitHub
6 changed files with 8 additions and 5 deletions

View File

@@ -296,7 +296,9 @@
// number of artifacts that can fit in a backpack. -1 is unlimited.
"backpackSize" : -1,
// if heroes are invitable in tavern
"tavernInvite" : false
"tavernInvite" : false,
// minimai primary skills for heroes
"minimalPrimarySkills": [ 0, 0, 1, 1]
},
"towns":

View File

@@ -86,7 +86,7 @@ int AFactionMember::getPrimSkillLevel(PrimarySkill id) const
static const std::string keyAllSkills = "type_PRIMARY_SKILL";
auto allSkills = getBonusBearer()->getBonuses(selectorAllSkills, keyAllSkills);
auto ret = allSkills->valOfBonuses(Selector::subtype()(BonusSubtypeID(id)));
auto minSkillValue = (id == PrimarySkill::SPELL_POWER || id == PrimarySkill::KNOWLEDGE) ? 1 : 0;
auto minSkillValue = VLC->settings()->getVector(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
}

View File

@@ -230,8 +230,7 @@ void CHeroClassHandler::fillPrimarySkillData(const JsonNode & node, CHeroClass *
{
const auto & skillName = NPrimarySkill::names[pSkill.getNum()];
auto currentPrimarySkillValue = static_cast<int>(node["primarySkills"][skillName].Integer());
//minimal value is 0 for attack and defense and 1 for spell power and knowledge
auto primarySkillLegalMinimum = (pSkill == PrimarySkill::ATTACK || pSkill == PrimarySkill::DEFENSE) ? 0 : 1;
int primarySkillLegalMinimum = VLC->settings()->getVector(EGameSettings::HEROES_MINIMAL_PRIMARY_SKILLS)[pSkill.getNum()];
if(currentPrimarySkillValue < primarySkillLegalMinimum)
{

View File

@@ -75,6 +75,7 @@ void GameSettings::load(const JsonNode & input)
{EGameSettings::HEROES_STARTING_STACKS_CHANCES, "heroes", "startingStackChances" },
{EGameSettings::HEROES_BACKPACK_CAP, "heroes", "backpackSize" },
{EGameSettings::HEROES_TAVERN_INVITE, "heroes", "tavernInvite" },
{EGameSettings::HEROES_MINIMAL_PRIMARY_SKILLS, "heroes", "minimalPrimarySkills" },
{EGameSettings::MAP_FORMAT_RESTORATION_OF_ERATHIA, "mapFormat", "restorationOfErathia" },
{EGameSettings::MAP_FORMAT_ARMAGEDDONS_BLADE, "mapFormat", "armageddonsBlade" },
{EGameSettings::MAP_FORMAT_SHADOW_OF_DEATH, "mapFormat", "shadowOfDeath" },

View File

@@ -39,6 +39,7 @@ enum class EGameSettings
HEROES_STARTING_STACKS_CHANCES,
HEROES_BACKPACK_CAP,
HEROES_TAVERN_INVITE,
HEROES_MINIMAL_PRIMARY_SKILLS,
MARKETS_BLACK_MARKET_RESTOCK_PERIOD,
BANKS_SHOW_GUARDS_COMPOSITION,
MODULE_COMMANDERS,

View File

@@ -107,7 +107,7 @@ bool Rewardable::Limiter::heroAllowed(const CGHeroInstance * hero) const
if (canLearnSkills && !hero->canLearnSkill())
return false;
if(manaPercentage > 100 * hero->mana / hero->manaLimit())
if (hero->manaLimit() != 0 && manaPercentage > 100 * hero->mana / hero->manaLimit())
return false;
for(size_t i=0; i<primary.size(); i++)