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

Removed remaining hardcoded objects

This commit is contained in:
Ivan Savenko
2023-01-23 15:27:01 +02:00
parent 62e127fb59
commit f8f6df02f3
14 changed files with 228 additions and 381 deletions

View File

@ -111,11 +111,11 @@ void CRewardableObject::onHeroVisit(const CGHeroInstance *h) const
// grant reward afterwards. Note that it may remove object
grantReward(index, h);
};
auto selectRewardsMessage = [&](std::vector<ui32> rewards) -> void
auto selectRewardsMessage = [&](std::vector<ui32> rewards, const MetaString & dialog) -> void
{
BlockingDialog sd(canRefuse, rewards.size() > 1);
sd.player = h->tempOwner;
sd.text = onSelect;
sd.text = dialog;
for (auto index : rewards)
sd.components.push_back(getVisitInfo(index, h).reward.getDisplayedComponent(h));
cb->showBlockingDialog(&sd);
@ -148,7 +148,7 @@ void CRewardableObject::onHeroVisit(const CGHeroInstance *h) const
case 1: // one reward. Just give it with message
{
if (canRefuse)
selectRewardsMessage(rewards);
selectRewardsMessage(rewards, getVisitInfo(rewards[0], h).message);
else
grantRewardWithMessage(rewards[0]);
break;
@ -157,7 +157,7 @@ void CRewardableObject::onHeroVisit(const CGHeroInstance *h) const
{
switch (selectMode) {
case SELECT_PLAYER: // player must select
selectRewardsMessage(rewards);
selectRewardsMessage(rewards, onSelect);
break;
case SELECT_FIRST: // give first available
grantRewardWithMessage(rewards[0]);
@ -269,7 +269,7 @@ void CRewardableObject::grantRewardAfterLevelup(const CVisitInfo & info, const C
if (info.reward.manaPercentage >= 0)
manaScaled = hero->manaLimit() * info.reward.manaPercentage / 100;
si32 manaMissing = hero->manaLimit() - manaScaled;
si32 manaMissing = std::max(0, hero->manaLimit() - manaScaled);
si32 manaGranted = std::min(manaMissing, info.reward.manaDiff);
si32 manaOverflow = info.reward.manaDiff - manaGranted;
si32 manaOverLimit = manaOverflow * info.reward.manaOverflowFactor / 100;
@ -364,6 +364,11 @@ CRewardableObject::EVisitMode CRewardableObject::getVisitMode() const
return EVisitMode(visitMode);
}
ui16 CRewardableObject::getResetDuration() const
{
return resetDuration;
}
void CRewardInfo::loadComponents(std::vector<Component> & comps,
const CGHeroInstance * h) const
{
@ -473,150 +478,7 @@ CRewardableObject::CRewardableObject():
{}
///////////////////////////////////////////////////////////////////////////////////////////////////
CGVisitableOPH::CGVisitableOPH()
{
visitMode = VISIT_HERO;
selectMode = SELECT_PLAYER;
}
void CGVisitableOPH::initObj(CRandomGenerator & rand)
{
switch(ID)
{
case Obj::TREE_OF_KNOWLEDGE:
info.resize(1);
canRefuse = true;
info[0].reward.gainedLevels = 1;
onVisited.addTxt(MetaString::ADVOB_TXT, 147);
info.resize(1);
switch (rand.nextInt(2))
{
case 0: // free
onSelect.addTxt(MetaString::ADVOB_TXT, 148);
break;
case 1:
info[0].limiter.resources[Res::GOLD] = 2000;
info[0].reward.resources[Res::GOLD] = -2000;
onSelect.addTxt(MetaString::ADVOB_TXT, 149);
onEmpty.addTxt(MetaString::ADVOB_TXT, 150);
break;
case 2:
info[0].limiter.resources[Res::GEMS] = 10;
info[0].reward.resources[Res::GEMS] = -10;
onSelect.addTxt(MetaString::ADVOB_TXT, 151);
onEmpty.addTxt(MetaString::ADVOB_TXT, 152);
break;
}
break;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
CGVisitableOPW::CGVisitableOPW()
{
visitMode = VISIT_ONCE;
resetDuration = 7;
}
void CGVisitableOPW::triggerRewardReset() const
{
CRewardableObject::triggerRewardReset();
ChangeObjectVisitors cov(ChangeObjectVisitors::VISITOR_CLEAR, id);
cb->sendAndApply(&cov);
}
void CGVisitableOPW::initObj(CRandomGenerator & rand)
{
setRandomReward(rand);
switch (ID)
{
case Obj::MYSTICAL_GARDEN:
onEmpty.addTxt(MetaString::ADVOB_TXT, 93);
info[0].message.addTxt(MetaString::ADVOB_TXT, 92);
break;
case Obj::WINDMILL:
onEmpty.addTxt(MetaString::ADVOB_TXT, 169);
info[0].message.addTxt(MetaString::ADVOB_TXT, 170);
break;
case Obj::WATER_WHEEL:
onEmpty.addTxt(MetaString::ADVOB_TXT, 165);
info[0].message.addTxt(MetaString::ADVOB_TXT, 164);
break;
}
}
void CGVisitableOPW::setPropertyDer(ui8 what, ui32 val)
{
if(what == ObjProperty::REWARD_RESET)
{
setRandomReward(cb->gameState()->getRandomGenerator());
if (ID == Obj::WATER_WHEEL)
{
auto& reward = info[0].reward.resources[Res::GOLD];
if(cb->getDate() > 7)
{
reward = 1000;
}
else
{
reward = 500;
}
}
}
CRewardableObject::setPropertyDer(what, val);
}
void CGVisitableOPW::setRandomReward(CRandomGenerator &rand)
{
switch (ID)
{
case Obj::MYSTICAL_GARDEN:
info.resize(1);
info[0].limiter.numOfGrants = 1;
info[0].reward.resources.amin(0);
if (rand.nextInt(1) == 0)
{
info[0].reward.resources[Res::GEMS] = 5;
}
else
{
info[0].reward.resources[Res::GOLD] = 500;
}
break;
case Obj::WINDMILL:
info.resize(1);
info[0].reward.resources.amin(0);
// 3-6 of any resource but wood and gold
info[0].reward.resources[rand.nextInt(Res::MERCURY, Res::GEMS)] = rand.nextInt(3, 6);
info[0].limiter.numOfGrants = 1;
break;
case Obj::WATER_WHEEL:
info.resize(1);
info[0].reward.resources.amin(0);
info[0].reward.resources[Res::GOLD] = 500;
info[0].limiter.numOfGrants = 1;
break;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
void CGMagicSpring::initObj(CRandomGenerator & rand)
{
CVisitInfo visit; // TODO: "player above max mana" limiter. Use logical expressions for limiters?
visit.reward.manaPercentage = 200;
visit.message.addTxt(MetaString::ADVOB_TXT, 74);
info.push_back(visit); // two rewards, one for each entrance
info.push_back(visit);
onEmpty.addTxt(MetaString::ADVOB_TXT, 75);
}
/*
std::vector<int3> CGMagicSpring::getVisitableOffsets() const
{
std::vector <int3> visitableTiles;
@ -660,5 +522,5 @@ std::vector<ui32> CGMagicSpring::getAvailableRewards(const CGHeroInstance * hero
// hero is either not on visitable tile (should not happen) or tile is already used
return std::vector<ui32>();
}
*/
VCMI_LIB_NAMESPACE_END