1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-27 22:49:25 +02:00

Implement STACK_EXPERIENCE_GAIN_PERCENT bonus

Suggested on Discord

- implements STACK_EXPERIENCE_GAIN_PERCENT that modifies stack
experience received by units after combat
- removed "EXPERIENCE" primary skill. Changes to experience are now
applied through separate netpack
This commit is contained in:
Ivan Savenko
2025-06-02 21:21:20 +03:00
parent 4fda657296
commit 139f41c9b2
24 changed files with 167 additions and 65 deletions

View File

@@ -154,7 +154,7 @@ void CGameHandler::levelUpHero(const CGHeroInstance * hero)
logGlobal->trace("%s got level %d", hero->getNameTranslated(), hero->level);
auto primarySkill = randomizer->rollPrimarySkillForLevelup(hero);
SetPrimSkill sps;
SetPrimarySkill sps;
sps.id = hero->id;
sps.which = primarySkill;
sps.mode = ChangeValueMode::RELATIVE;
@@ -338,6 +338,19 @@ void CGameHandler::expGiven(const CGHeroInstance *hero)
levelUpCommander(hero->getCommander());
}
void CGameHandler::giveStackExperience(const CArmedInstance * army, TExpType val)
{
GiveStackExperience gse;
gse.id = army->id;
for (const auto & stack : army->Slots())
{
int experienceBonusMultiplier = stack.second->valOfBonuses(BonusType::STACK_EXPERIENCE_GAIN_PERCENT);
gse.val[stack.first] = val + val * experienceBonusMultiplier / 100;
}
sendAndApply(gse);
}
void CGameHandler::giveExperience(const CGHeroInstance * hero, TExpType amountToGain)
{
TExpType maxExp = LIBRARY->heroh->reqExp(LIBRARY->heroh->maxSupportedLevel());
@@ -362,12 +375,11 @@ void CGameHandler::giveExperience(const CGHeroInstance * hero, TExpType amountTo
sendAndApply(iw);
}
SetPrimSkill sps;
sps.id = hero->id;
sps.which = PrimarySkill::EXPERIENCE;
sps.mode = ChangeValueMode::RELATIVE;
sps.val = amountToGain;
sendAndApply(sps);
SetHeroExperience she;
she.id = hero->id;
she.mode = ChangeValueMode::RELATIVE;
she.val = amountToGain;
sendAndApply(she);
//hero may level up
if (hero->getCommander() && hero->getCommander()->alive)
@@ -385,7 +397,7 @@ void CGameHandler::giveExperience(const CGHeroInstance * hero, TExpType amountTo
void CGameHandler::changePrimSkill(const CGHeroInstance * hero, PrimarySkill which, si64 val, ChangeValueMode mode)
{
SetPrimSkill sps;
SetPrimarySkill sps;
sps.id = hero->id;
sps.which = which;
sps.mode = mode;