| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- /*
- * 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<Component> comps;
- loadComponents(comps, h);
- assert(!comps.empty());
- return comps.front();
- }
- void Rewardable::Reward::loadComponents(std::vector<Component> & comps,
- const CGHeroInstance * h) const
- {
- for (auto comp : extraComponents)
- comps.push_back(comp);
- if (heroExperience)
- {
- comps.emplace_back(Component::EComponentType::EXPERIENCE, 0, static_cast<si32>(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<primary.size(); i++)
- {
- if (primary[i] != 0)
- comps.emplace_back(Component::EComponentType::PRIM_SKILL, static_cast<ui16>(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<resources.size(); i++)
- {
- if (resources[i] !=0)
- comps.emplace_back(Component::EComponentType::RESOURCE, static_cast<ui16>(i), resources[i], 0);
- }
- }
- VCMI_LIB_NAMESPACE_END
|