CRewardableConstructor.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /*
  2. * CRewardableConstructor.cpp, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #include "StdInc.h"
  11. #include "CRewardableConstructor.h"
  12. #include "../mapObjects/CRewardableObject.h"
  13. #include "../CGeneralTextHandler.h"
  14. #include "../IGameCallback.h"
  15. VCMI_LIB_NAMESPACE_BEGIN
  16. void CRewardableConstructor::initTypeData(const JsonNode & config)
  17. {
  18. objectInfo.init(config, getBaseTextID());
  19. blockVisit = config["blockedVisitable"].Bool();
  20. if (!config["name"].isNull())
  21. VLC->generaltexth->registerString( config.getModScope(), getNameTextID(), config["name"].String());
  22. }
  23. bool CRewardableConstructor::hasNameTextID() const
  24. {
  25. return !objectInfo.getParameters()["name"].isNull();
  26. }
  27. CGObjectInstance * CRewardableConstructor::create(IGameCallback * cb, std::shared_ptr<const ObjectTemplate> tmpl) const
  28. {
  29. auto * ret = new CRewardableObject(cb);
  30. preInitObject(ret);
  31. ret->appearance = tmpl;
  32. ret->blockVisit = blockVisit;
  33. return ret;
  34. }
  35. Rewardable::Configuration CRewardableConstructor::generateConfiguration(IGameCallback * cb, vstd::RNG & rand, MapObjectID objectID) const
  36. {
  37. Rewardable::Configuration result;
  38. objectInfo.configureObject(result, rand, cb);
  39. for(auto & rewardInfo : result.info)
  40. {
  41. for (auto & bonus : rewardInfo.reward.bonuses)
  42. {
  43. bonus.source = BonusSource::OBJECT_TYPE;
  44. bonus.sid = BonusSourceID(objectID);
  45. }
  46. }
  47. return result;
  48. }
  49. void CRewardableConstructor::configureObject(CGObjectInstance * object, vstd::RNG & rng) const
  50. {
  51. if(auto * rewardableObject = dynamic_cast<CRewardableObject*>(object))
  52. {
  53. rewardableObject->configuration = generateConfiguration(object->cb, rng, object->ID);
  54. if (rewardableObject->configuration.info.empty())
  55. {
  56. if (objectInfo.getParameters()["rewards"].isNull())
  57. logMod->error("Object %s has invalid configuration! No defined rewards found!", getJsonKey());
  58. else
  59. logMod->error("Object %s has invalid configuration! Make sure that defined appear chances are continuous!", getJsonKey());
  60. }
  61. }
  62. }
  63. std::unique_ptr<IObjectInfo> CRewardableConstructor::getObjectInfo(std::shared_ptr<const ObjectTemplate> tmpl) const
  64. {
  65. return std::unique_ptr<IObjectInfo>(new Rewardable::Info(objectInfo));
  66. }
  67. VCMI_LIB_NAMESPACE_END