FlaggableMapObject.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /*
  2. * FlaggableMapObject.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 "FlaggableMapObject.h"
  12. #include "../IGameCallback.h"
  13. #include "CGHeroInstance.h"
  14. #include "../networkPacks/PacksForClient.h"
  15. #include "../mapObjectConstructors/FlaggableInstanceConstructor.h"
  16. VCMI_LIB_NAMESPACE_BEGIN
  17. const IOwnableObject * FlaggableMapObject::asOwnable() const
  18. {
  19. return this;
  20. }
  21. ResourceSet FlaggableMapObject::dailyIncome() const
  22. {
  23. return getFlaggableHandler()->getDailyIncome();
  24. }
  25. std::vector<CreatureID> FlaggableMapObject::providedCreatures() const
  26. {
  27. return {};
  28. }
  29. void FlaggableMapObject::onHeroVisit( const CGHeroInstance * h ) const
  30. {
  31. if (cb->getPlayerRelations(h->getOwner(), getOwner()) != PlayerRelations::ENEMIES)
  32. return; // H3 behavior - revisiting owned Lighthouse is a no-op
  33. if (getOwner().isValidPlayer())
  34. takeBonusFrom(getOwner());
  35. cb->setOwner(this, h->getOwner()); //not ours? flag it!
  36. InfoWindow iw;
  37. iw.player = h->getOwner();
  38. iw.text.appendTextID(getFlaggableHandler()->getVisitMessageTextID());
  39. cb->showInfoDialog(&iw);
  40. giveBonusTo(h->getOwner());
  41. }
  42. void FlaggableMapObject::markAsDeleted() const
  43. {
  44. if(getOwner().isValidPlayer())
  45. takeBonusFrom(getOwner());
  46. }
  47. void FlaggableMapObject::initObj(vstd::RNG & rand)
  48. {
  49. if(getOwner().isValidPlayer())
  50. {
  51. // FIXME: This is dirty hack
  52. giveBonusTo(getOwner(), true);
  53. }
  54. }
  55. std::shared_ptr<FlaggableInstanceConstructor> FlaggableMapObject::getFlaggableHandler() const
  56. {
  57. return std::dynamic_pointer_cast<FlaggableInstanceConstructor>(getObjectHandler());
  58. }
  59. void FlaggableMapObject::giveBonusTo(const PlayerColor & player, bool onInit) const
  60. {
  61. for (auto const & bonus : getFlaggableHandler()->getProvidedBonuses())
  62. {
  63. GiveBonus gb(GiveBonus::ETarget::PLAYER);
  64. gb.id = player;
  65. gb.bonus = *bonus;
  66. // FIXME: better place for this code?
  67. gb.bonus.duration = BonusDuration::PERMANENT;
  68. gb.bonus.source = BonusSource::OBJECT_INSTANCE;
  69. gb.bonus.sid = BonusSourceID(id);
  70. // FIXME: This is really dirty hack
  71. // Proper fix would be to make FlaggableMapObject into bonus system node
  72. // Unfortunately this will cause saves breakage
  73. if(onInit)
  74. gb.applyGs(&cb->gameState());
  75. else
  76. cb->sendAndApply(gb);
  77. }
  78. }
  79. void FlaggableMapObject::takeBonusFrom(const PlayerColor & player) const
  80. {
  81. RemoveBonus rb(GiveBonus::ETarget::PLAYER);
  82. rb.whoID = player;
  83. rb.source = BonusSource::OBJECT_INSTANCE;
  84. rb.id = BonusSourceID(id);
  85. cb->sendAndApply(rb);
  86. }
  87. void FlaggableMapObject::serializeJsonOptions(JsonSerializeFormat& handler)
  88. {
  89. serializeJsonOwner(handler);
  90. }
  91. VCMI_LIB_NAMESPACE_END