/* * Reward.cpp, part of VCMI engine * * Authors: listed in file AUTHORS in main folder * * License: GNU General Public License v2.0 or later * Full text of license available in license.txt file, in main folder * */ #include "StdInc.h" #include "Reward.h" VCMI_LIB_NAMESPACE_BEGIN si32 Rewardable::Reward::calculateManaPoints(const CGHeroInstance * hero) const { si32 manaScaled = hero->mana; if (manaPercentage >= 0) manaScaled = hero->manaLimit() * manaPercentage / 100; si32 manaMissing = std::max(0, hero->manaLimit() - manaScaled); si32 manaGranted = std::min(manaMissing, manaDiff); si32 manaOverflow = manaDiff - manaGranted; si32 manaOverLimit = manaOverflow * manaOverflowFactor / 100; si32 manaOutput = manaScaled + manaGranted + manaOverLimit; return manaOutput; } Component Rewardable::Reward::getDisplayedComponent(const CGHeroInstance * h) const { std::vector comps; loadComponents(comps, h); assert(!comps.empty()); return comps.front(); } void Rewardable::Reward::loadComponents(std::vector & comps, const CGHeroInstance * h) const { for (auto comp : extraComponents) comps.push_back(comp); if (heroExperience) { comps.emplace_back(Component::EComponentType::EXPERIENCE, 0, static_cast(h->calculateXp(heroExperience)), 0); } if (heroLevel) comps.emplace_back(Component::EComponentType::EXPERIENCE, 1, heroLevel, 0); if (manaDiff || manaPercentage >= 0) comps.emplace_back(Component::EComponentType::PRIM_SKILL, 5, calculateManaPoints(h) - h->mana, 0); for (size_t i=0; i(i), primary[i], 0); } for(const auto & entry : secondary) comps.emplace_back(Component::EComponentType::SEC_SKILL, entry.first, entry.second, 0); for(const auto & entry : artifacts) comps.emplace_back(Component::EComponentType::ARTIFACT, entry, 1, 0); for(const auto & entry : spells) comps.emplace_back(Component::EComponentType::SPELL, entry, 1, 0); for(const auto & entry : creatures) comps.emplace_back(Component::EComponentType::CREATURE, entry.type->getId(), entry.count, 0); for (size_t i=0; i(i), resources[i], 0); } } VCMI_LIB_NAMESPACE_END