CGResource.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /*
  2. * MiscObjects.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 "CGResource.h"
  12. #include "../callback/CGameInfoCallback.h"
  13. #include "../callback/IGameEventCallback.h"
  14. #include "../mapObjectConstructors/CommonConstructors.h"
  15. #include "../texts/CGeneralTextHandler.h"
  16. #include "../networkPacks/PacksForClient.h"
  17. #include "../networkPacks/PacksForClientBattle.h"
  18. #include "../gameState/CGameState.h"
  19. #include "../serializer/JsonSerializeFormat.h"
  20. #include "../CSoundBase.h"
  21. #include <vstd/RNG.h>
  22. VCMI_LIB_NAMESPACE_BEGIN
  23. std::shared_ptr<ResourceInstanceConstructor> CGResource::getResourceHandler() const
  24. {
  25. const auto & baseHandler = getObjectHandler();
  26. const auto & ourHandler = std::dynamic_pointer_cast<ResourceInstanceConstructor>(baseHandler);
  27. return ourHandler;
  28. }
  29. int CGResource::getAmountMultiplier() const
  30. {
  31. return getResourceHandler()->getAmountMultiplier();
  32. }
  33. uint32_t CGResource::getAmount() const
  34. {
  35. return amount;
  36. }
  37. GameResID CGResource::resourceID() const
  38. {
  39. return getResourceHandler()->getResourceType();
  40. }
  41. std::string CGResource::getHoverText(PlayerColor player) const
  42. {
  43. return LIBRARY->generaltexth->restypes[resourceID().getNum()];
  44. }
  45. void CGResource::pickRandomObject(vstd::RNG & rand)
  46. {
  47. assert(ID == Obj::RESOURCE || ID == Obj::RANDOM_RESOURCE);
  48. if (ID == Obj::RANDOM_RESOURCE)
  49. {
  50. ID = Obj::RESOURCE;
  51. subID = rand.nextInt(EGameResID::WOOD, EGameResID::GOLD);
  52. setType(ID, subID);
  53. amount *= getAmountMultiplier();
  54. }
  55. }
  56. void CGResource::initObj(vstd::RNG & rand)
  57. {
  58. blockVisit = true;
  59. getResourceHandler()->randomizeObject(this, rand);
  60. }
  61. void CGResource::onHeroVisit(IGameEventCallback & gameEvents, const CGHeroInstance * h) const
  62. {
  63. if(stacksCount())
  64. {
  65. if(!message.empty())
  66. {
  67. BlockingDialog ynd(true,false);
  68. ynd.player = h->getOwner();
  69. ynd.text = message;
  70. gameEvents.showBlockingDialog(this, &ynd);
  71. }
  72. else
  73. {
  74. blockingDialogAnswered(gameEvents, h, true); //behave as if player accepted battle
  75. }
  76. }
  77. else
  78. collectRes(gameEvents, h->getOwner());
  79. }
  80. void CGResource::collectRes(IGameEventCallback & gameEvents, const PlayerColor & player) const
  81. {
  82. gameEvents.giveResource(player, resourceID(), amount);
  83. InfoWindow sii;
  84. sii.player = player;
  85. if(!message.empty())
  86. {
  87. sii.type = EInfoWindowMode::AUTO;
  88. sii.text = message;
  89. }
  90. else
  91. {
  92. sii.type = EInfoWindowMode::INFO;
  93. sii.text.appendLocalString(EMetaText::ADVOB_TXT,113);
  94. sii.text.replaceName(resourceID());
  95. }
  96. sii.components.emplace_back(ComponentType::RESOURCE, resourceID(), amount);
  97. sii.soundID = soundBase::pickup01 + gameEvents.getRandomGenerator().nextInt(6);
  98. gameEvents.showInfoDialog(&sii);
  99. gameEvents.removeObject(this, player);
  100. }
  101. void CGResource::battleFinished(IGameEventCallback & gameEvents, const CGHeroInstance *hero, const BattleResult &result) const
  102. {
  103. if(result.winner == BattleSide::ATTACKER) //attacker won
  104. collectRes(gameEvents, hero->getOwner());
  105. }
  106. void CGResource::blockingDialogAnswered(IGameEventCallback & gameEvents, const CGHeroInstance *hero, int32_t answer) const
  107. {
  108. if(answer)
  109. gameEvents.startBattle(hero, this);
  110. }
  111. void CGResource::serializeJsonOptions(JsonSerializeFormat & handler)
  112. {
  113. CArmedInstance::serializeJsonOptions(handler);
  114. if(!handler.saving && !handler.getCurrent()["guards"].Vector().empty())
  115. CCreatureSet::serializeJson(handler, "guards", 7);
  116. handler.serializeInt("amount", amount, 0);
  117. handler.serializeStruct("guardMessage", message);
  118. }
  119. VCMI_LIB_NAMESPACE_END