CBankInstanceConstructor.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. /*
  2. * CBankInstanceConstructor.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 "CBankInstanceConstructor.h"
  12. #include "../JsonRandom.h"
  13. #include "../CGeneralTextHandler.h"
  14. #include "../IGameCallback.h"
  15. VCMI_LIB_NAMESPACE_BEGIN
  16. bool CBankInstanceConstructor::hasNameTextID() const
  17. {
  18. return true;
  19. }
  20. void CBankInstanceConstructor::initTypeData(const JsonNode & input)
  21. {
  22. if (input.Struct().count("name") == 0)
  23. logMod->warn("Bank %s missing name!", getJsonKey());
  24. VLC->generaltexth->registerString(input.meta, getNameTextID(), input["name"].String());
  25. levels = input["levels"].Vector();
  26. bankResetDuration = static_cast<si32>(input["resetDuration"].Float());
  27. blockVisit = input["blockedVisitable"].Bool();
  28. coastVisitable = input["coastVisitable"].Bool();
  29. }
  30. BankConfig CBankInstanceConstructor::generateConfig(IGameCallback * cb, const JsonNode & level, CRandomGenerator & rng) const
  31. {
  32. BankConfig bc;
  33. JsonRandom randomizer(cb);
  34. JsonRandom::Variables emptyVariables;
  35. bc.chance = static_cast<ui32>(level["chance"].Float());
  36. bc.guards = randomizer.loadCreatures(level["guards"], rng, emptyVariables);
  37. bc.resources = ResourceSet(level["reward"]["resources"]);
  38. bc.creatures = randomizer.loadCreatures(level["reward"]["creatures"], rng, emptyVariables);
  39. bc.artifacts = randomizer.loadArtifacts(level["reward"]["artifacts"], rng, emptyVariables);
  40. bc.spells = randomizer.loadSpells(level["reward"]["spells"], rng, emptyVariables);
  41. return bc;
  42. }
  43. void CBankInstanceConstructor::randomizeObject(CBank * bank, CRandomGenerator & rng) const
  44. {
  45. bank->resetDuration = bankResetDuration;
  46. bank->blockVisit = blockVisit;
  47. bank->coastVisitable = coastVisitable;
  48. si32 totalChance = 0;
  49. for(const auto & node : levels)
  50. totalChance += static_cast<si32>(node["chance"].Float());
  51. assert(totalChance != 0);
  52. si32 selectedChance = rng.nextInt(totalChance - 1);
  53. int cumulativeChance = 0;
  54. for(const auto & node : levels)
  55. {
  56. cumulativeChance += static_cast<int>(node["chance"].Float());
  57. if(selectedChance < cumulativeChance)
  58. {
  59. bank->setConfig(generateConfig(bank->cb, node, rng));
  60. break;
  61. }
  62. }
  63. }
  64. CBankInfo::CBankInfo(const JsonVector & Config) :
  65. config(Config)
  66. {
  67. assert(!Config.empty());
  68. }
  69. TPossibleGuards CBankInfo::getPossibleGuards(IGameCallback * cb) const
  70. {
  71. JsonRandom::Variables emptyVariables;
  72. JsonRandom randomizer(cb);
  73. TPossibleGuards out;
  74. for(const JsonNode & configEntry : config)
  75. {
  76. const JsonNode & guardsInfo = configEntry["guards"];
  77. auto stacks = randomizer.evaluateCreatures(guardsInfo, emptyVariables);
  78. IObjectInfo::CArmyStructure army;
  79. for(auto stack : stacks)
  80. {
  81. army.totalStrength += stack.allowedCreatures.front()->getAIValue() * (stack.minAmount + stack.maxAmount) / 2;
  82. //TODO: add fields for flyers, walkers etc...
  83. }
  84. ui8 chance = static_cast<ui8>(configEntry["chance"].Float());
  85. out.push_back(std::make_pair(chance, army));
  86. }
  87. return out;
  88. }
  89. std::vector<PossibleReward<TResources>> CBankInfo::getPossibleResourcesReward() const
  90. {
  91. std::vector<PossibleReward<TResources>> result;
  92. for(const JsonNode & configEntry : config)
  93. {
  94. const JsonNode & resourcesInfo = configEntry["reward"]["resources"];
  95. if(!resourcesInfo.isNull())
  96. {
  97. result.emplace_back(configEntry["chance"].Integer(), TResources(resourcesInfo));
  98. }
  99. }
  100. return result;
  101. }
  102. std::vector<PossibleReward<CStackBasicDescriptor>> CBankInfo::getPossibleCreaturesReward(IGameCallback * cb) const
  103. {
  104. JsonRandom::Variables emptyVariables;
  105. JsonRandom randomizer(cb);
  106. std::vector<PossibleReward<CStackBasicDescriptor>> aproximateReward;
  107. for(const JsonNode & configEntry : config)
  108. {
  109. const JsonNode & guardsInfo = configEntry["reward"]["creatures"];
  110. auto stacks = randomizer.evaluateCreatures(guardsInfo, emptyVariables);
  111. for(auto stack : stacks)
  112. {
  113. const auto * creature = stack.allowedCreatures.front();
  114. aproximateReward.emplace_back(configEntry["chance"].Integer(), CStackBasicDescriptor(creature, (stack.minAmount + stack.maxAmount) / 2));
  115. }
  116. }
  117. return aproximateReward;
  118. }
  119. bool CBankInfo::givesResources() const
  120. {
  121. for(const JsonNode & node : config)
  122. if(!node["reward"]["resources"].isNull())
  123. return true;
  124. return false;
  125. }
  126. bool CBankInfo::givesArtifacts() const
  127. {
  128. for(const JsonNode & node : config)
  129. if(!node["reward"]["artifacts"].isNull())
  130. return true;
  131. return false;
  132. }
  133. bool CBankInfo::givesCreatures() const
  134. {
  135. for(const JsonNode & node : config)
  136. if(!node["reward"]["creatures"].isNull())
  137. return true;
  138. return false;
  139. }
  140. bool CBankInfo::givesSpells() const
  141. {
  142. for(const JsonNode & node : config)
  143. if(!node["reward"]["spells"].isNull())
  144. return true;
  145. return false;
  146. }
  147. std::unique_ptr<IObjectInfo> CBankInstanceConstructor::getObjectInfo(std::shared_ptr<const ObjectTemplate> tmpl) const
  148. {
  149. return std::unique_ptr<IObjectInfo>(new CBankInfo(levels));
  150. }
  151. VCMI_LIB_NAMESPACE_END