1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-06-15 00:05:02 +02:00

It is now possible to configure what exactly will be reset in object

This commit is contained in:
Ivan Savenko
2023-01-24 13:54:03 +02:00
parent 0c70822928
commit ecbcafefbc
7 changed files with 112 additions and 32 deletions

View File

@ -102,7 +102,7 @@ std::vector<ui32> CRewardableObject::getAvailableRewards(const CGHeroInstance *
for(size_t i=0; i<info.size(); i++)
{
const CVisitInfo & visit = info[i];
const CRewardVisitInfo & visit = info[i];
if((visit.numOfGrantsAllowed == 0 || visit.numOfGrantsPerformed < visit.numOfGrantsAllowed) // reward has unlimited uses or some are still available
&& visit.limiter.heroAllowed(hero))
@ -114,7 +114,7 @@ std::vector<ui32> CRewardableObject::getAvailableRewards(const CGHeroInstance *
return ret;
}
CVisitInfo CRewardableObject::getVisitInfo(int index, const CGHeroInstance *) const
CRewardVisitInfo CRewardableObject::getVisitInfo(int index, const CGHeroInstance *) const
{
return info[index];
}
@ -250,7 +250,7 @@ void CRewardableObject::grantReward(ui32 rewardID, const CGHeroInstance * hero)
grantRewardBeforeLevelup(getVisitInfo(rewardID, hero), hero);
}
void CRewardableObject::grantRewardBeforeLevelup(const CVisitInfo & info, const CGHeroInstance * hero) const
void CRewardableObject::grantRewardBeforeLevelup(const CRewardVisitInfo & info, const CGHeroInstance * hero) const
{
assert(hero);
assert(hero->tempOwner.isValidPlayer());
@ -287,7 +287,7 @@ void CRewardableObject::grantRewardBeforeLevelup(const CVisitInfo & info, const
}
}
void CRewardableObject::grantRewardAfterLevelup(const CVisitInfo & info, const CGHeroInstance * hero) const
void CRewardableObject::grantRewardAfterLevelup(const CRewardVisitInfo & info, const CGHeroInstance * hero) const
{
if(info.reward.manaDiff || info.reward.manaPercentage >= 0)
{
@ -392,7 +392,7 @@ CRewardableObject::EVisitMode CRewardableObject::getVisitMode() const
ui16 CRewardableObject::getResetDuration() const
{
return resetDuration;
return resetParameters.period;
}
void CRewardInfo::loadComponents(std::vector<Component> & comps,
@ -468,7 +468,10 @@ void CRewardableObject::setPropertyDer(ui8 what, ui32 val)
{
switch (what)
{
case ObjProperty::REWARD_RESET:
case ObjProperty::REWARD_RANDOMIZE:
initObj(cb->gameState()->getRandomGenerator());
break;
case ObjProperty::REWARDS_CLEAR_GRANTS:
for (auto & visit : info)
visit.numOfGrantsPerformed = 0;
break;
@ -479,15 +482,27 @@ void CRewardableObject::setPropertyDer(ui8 what, ui32 val)
}
}
void CRewardableObject::triggerRewardReset() const
void CRewardableObject::triggerReset() const
{
cb->setObjProperty(id, ObjProperty::REWARD_RESET, 0);
if (resetParameters.rewards)
{
cb->setObjProperty(id, ObjProperty::REWARD_RANDOMIZE, 0);
}
if (resetParameters.grants)
{
cb->setObjProperty(id, ObjProperty::REWARDS_CLEAR_GRANTS, 0);
}
if (resetParameters.visitors)
{
ChangeObjectVisitors cov(ChangeObjectVisitors::VISITOR_CLEAR, id);
cb->sendAndApply(&cov);
}
}
void CRewardableObject::newTurn(CRandomGenerator & rand) const
{
if (resetDuration != 0 && cb->getDate(Date::DAY) > 1 && (cb->getDate(Date::DAY) % resetDuration) == 1)
triggerRewardReset();
if (resetParameters.period != 0 && cb->getDate(Date::DAY) > 1 && (cb->getDate(Date::DAY) % resetParameters.period) == 1)
triggerReset();
}
void CRewardableObject::initObj(CRandomGenerator & rand)
@ -499,7 +514,6 @@ CRewardableObject::CRewardableObject():
selectMode(0),
visitMode(0),
selectedReward(0),
resetDuration(0),
canRefuse(false)
{}