1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-04-15 11:46:56 +02:00

Support rewardable objects

This commit is contained in:
nordsoft 2022-09-14 22:51:19 +04:00 committed by Andrii Danylchenko
parent 5637cdbe3f
commit 7dc05d8e81
3 changed files with 35 additions and 4 deletions

View File

@ -111,16 +111,35 @@ void CRandomRewardObjectInfo::configureObject(CRewardableObject * object, CRando
info.message = loadMessage(reward["message"]); info.message = loadMessage(reward["message"]);
info.selectChance = JsonRandom::loadValue(reward["selectChance"], rng); info.selectChance = JsonRandom::loadValue(reward["selectChance"], rng);
object->info.push_back(info);
} }
object->onSelect = loadMessage(parameters["onSelectMessage"]); object->onSelect = loadMessage(parameters["onSelectMessage"]);
object->onVisited = loadMessage(parameters["onVisitedMessage"]); object->onVisited = loadMessage(parameters["onVisitedMessage"]);
object->onEmpty = loadMessage(parameters["onEmptyMessage"]); object->onEmpty = loadMessage(parameters["onEmptyMessage"]);
//TODO: visitMode and selectMode
object->resetDuration = static_cast<ui16>(parameters["resetDuration"].Float()); object->resetDuration = static_cast<ui16>(parameters["resetDuration"].Float());
object->canRefuse = parameters["canRefuse"].Bool(); object->canRefuse = parameters["canRefuse"].Bool();
auto visitMode = parameters["visitMode"].String();
for(int i = 0; Rewardable::VisitModeString.size(); ++i)
{
if(Rewardable::VisitModeString[i] == visitMode)
{
object->visitMode = i;
break;
}
}
auto selectMode = parameters["selectMode"].String();
for(int i = 0; Rewardable::SelectModeString.size(); ++i)
{
if(Rewardable::SelectModeString[i] == selectMode)
{
object->selectMode = i;
break;
}
}
} }
bool CRandomRewardObjectInfo::givesResources() const bool CRandomRewardObjectInfo::givesResources() const
@ -179,7 +198,6 @@ CRewardableConstructor::CRewardableConstructor()
void CRewardableConstructor::initTypeData(const JsonNode & config) void CRewardableConstructor::initTypeData(const JsonNode & config)
{ {
AObjectTypeHandler::init(config);
objectInfo.init(config); objectInfo.init(config);
} }

View File

@ -446,6 +446,11 @@ void CRewardableObject::newTurn(CRandomGenerator & rand) const
triggerRewardReset(); triggerRewardReset();
} }
void CRewardableObject::initObj(CRandomGenerator & rand)
{
VLC->objtypeh->getHandlerFor(ID, subID)->configureObject(this, rand);
}
CRewardableObject::CRewardableObject(): CRewardableObject::CRewardableObject():
selectMode(0), selectMode(0),
visitMode(0), visitMode(0),

View File

@ -175,6 +175,12 @@ public:
} }
}; };
namespace Rewardable
{
const std::array<std::string, 3> SelectModeString{"selectFirst", "selectPlayer", "selectRandom"};
const std::array<std::string, 5> VisitModeString{"unlimited", "once", "hero", "bonus", "player"};
}
/// Base class that can handle granting rewards to visiting heroes. /// Base class that can handle granting rewards to visiting heroes.
/// Inherits from CArmedInstance for proper trasfer of armies /// Inherits from CArmedInstance for proper trasfer of armies
class DLL_LINKAGE CRewardableObject : public CArmedInstance class DLL_LINKAGE CRewardableObject : public CArmedInstance
@ -257,6 +263,8 @@ public:
/// function that will be called once reward is fully granted to hero /// function that will be called once reward is fully granted to hero
virtual void onRewardGiven(const CGHeroInstance * hero) const; virtual void onRewardGiven(const CGHeroInstance * hero) const;
void initObj(CRandomGenerator & rand) override;
CRewardableObject(); CRewardableObject();
template <typename Handler> void serialize(Handler &h, const int version) template <typename Handler> void serialize(Handler &h, const int version)