1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-08-13 19:54:17 +02:00

Merge pull request #3377 from dydzio0614/commander-skills-fix

Commander skills fix
This commit is contained in:
Ivan Savenko
2023-12-24 13:33:48 +02:00
committed by GitHub
4 changed files with 12 additions and 3 deletions

View File

@@ -82,6 +82,13 @@ namespace Selector
return CSelectFieldEqual<BonusValueType>(&Bonus::valType)(valType); return CSelectFieldEqual<BonusValueType>(&Bonus::valType)(valType);
} }
CSelector DLL_LINKAGE typeSubtypeValueType(BonusType Type, BonusSubtypeID Subtype, BonusValueType valType)
{
return type()(Type)
.And(subtype()(Subtype))
.And(valueType(valType));
}
DLL_LINKAGE CSelector all([](const Bonus * b){return true;}); DLL_LINKAGE CSelector all([](const Bonus * b){return true;});
DLL_LINKAGE CSelector none([](const Bonus * b){return false;}); DLL_LINKAGE CSelector none([](const Bonus * b){return false;});
} }

View File

@@ -139,6 +139,7 @@ namespace Selector
CSelector DLL_LINKAGE source(BonusSource source, BonusSourceID sourceID); CSelector DLL_LINKAGE source(BonusSource source, BonusSourceID sourceID);
CSelector DLL_LINKAGE sourceTypeSel(BonusSource source); CSelector DLL_LINKAGE sourceTypeSel(BonusSource source);
CSelector DLL_LINKAGE valueType(BonusValueType valType); CSelector DLL_LINKAGE valueType(BonusValueType valType);
CSelector DLL_LINKAGE typeSubtypeValueType(BonusType Type, BonusSubtypeID Subtype, BonusValueType valType);
/** /**
* Selects all bonuses * Selects all bonuses

View File

@@ -356,7 +356,7 @@ void CBonusSystemNode::addNewBonus(const std::shared_ptr<Bonus>& b)
void CBonusSystemNode::accumulateBonus(const std::shared_ptr<Bonus>& b) void CBonusSystemNode::accumulateBonus(const std::shared_ptr<Bonus>& b)
{ {
auto bonus = exportedBonuses.getFirst(Selector::typeSubtype(b->type, b->subtype)); //only local bonuses are interesting //TODO: what about value type? auto bonus = exportedBonuses.getFirst(Selector::typeSubtypeValueType(b->type, b->subtype, b->valType)); //only local bonuses are interesting
if(bonus) if(bonus)
bonus->val += b->val; bonus->val += b->val;
else else

View File

@@ -253,11 +253,12 @@ void CGameHandler::levelUpCommander (const CCommanderInstance * c, int skill)
break; break;
case ECommander::HEALTH: case ECommander::HEALTH:
scp.accumulatedBonus.type = BonusType::STACK_HEALTH; scp.accumulatedBonus.type = BonusType::STACK_HEALTH;
scp.accumulatedBonus.valType = BonusValueType::PERCENT_TO_BASE; scp.accumulatedBonus.valType = BonusValueType::PERCENT_TO_ALL; //TODO: check how it accumulates in original WoG with artifacts such as vial of life blood, elixir of life etc.
break; break;
case ECommander::DAMAGE: case ECommander::DAMAGE:
scp.accumulatedBonus.type = BonusType::CREATURE_DAMAGE; scp.accumulatedBonus.type = BonusType::CREATURE_DAMAGE;
scp.accumulatedBonus.valType = BonusValueType::PERCENT_TO_BASE; scp.accumulatedBonus.subtype = BonusCustomSubtype::creatureDamageBoth;
scp.accumulatedBonus.valType = BonusValueType::PERCENT_TO_ALL;
break; break;
case ECommander::SPEED: case ECommander::SPEED:
scp.accumulatedBonus.type = BonusType::STACKS_SPEED; scp.accumulatedBonus.type = BonusType::STACKS_SPEED;