QuestReward.cpp 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. #include "QuestReward.h"
  2. #include <Fenster.h>
  3. #include "Entity.h"
  4. #include "Game.h"
  5. #include "Player.h"
  6. #include "Quest.h"
  7. #include "UIMLBuilder.h"
  8. QuestReward::QuestReward()
  9. : ReferenceCounter()
  10. {}
  11. bool QuestReward::validateSettings(
  12. Framework::XML::Element* zParent, QuestStorage* zStorage)
  13. {
  14. return true;
  15. }
  16. void QuestReward::api(Framework::StreamReader* message,
  17. Framework::XML::Element* zParent,
  18. QuestStorage* zStorage)
  19. {}
  20. void QuestReward::setRewardId(Framework::Text rewardId)
  21. {
  22. this->rewardId = rewardId;
  23. }
  24. const Framework::Text& QuestReward::getRewardId() const
  25. {
  26. return rewardId;
  27. }
  28. ItemStackInfo::ItemStackInfo()
  29. : ReferenceCounter(),
  30. item(0),
  31. count(0)
  32. {}
  33. ItemStackInfo::~ItemStackInfo()
  34. {
  35. if (item) item->release();
  36. }
  37. void ItemStackInfo::setItem(Item* item)
  38. {
  39. if (this->item) this->item->release();
  40. this->item = item;
  41. }
  42. Item* ItemStackInfo::zItem() const
  43. {
  44. return item;
  45. }
  46. void ItemStackInfo::setCount(int count)
  47. {
  48. this->count = count;
  49. }
  50. int ItemStackInfo::getCount() const
  51. {
  52. return count;
  53. }
  54. ItemStackInfoType::ItemStackInfoType()
  55. : ObjectTypeFactory<ItemStackInfo>()
  56. {}
  57. ItemStackInfo* ItemStackInfoType::fromJson(
  58. Framework::JSON::JSONObject* zJson) const
  59. {
  60. ItemStackInfo* result = new ItemStackInfo();
  61. result->setItem(Game::INSTANCE->zTypeRegistry()->fromJson<Item>(
  62. zJson->asObject()->zValue("item")));
  63. result->setCount(
  64. (int)zJson->asObject()->zValue("count")->asNumber()->getNumber());
  65. return result;
  66. }
  67. Framework::JSON::JSONObject* ItemStackInfoType::toJsonObject(
  68. ItemStackInfo* zObject) const
  69. {
  70. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  71. result->addValue(
  72. "item", Game::INSTANCE->zTypeRegistry()->toJson(zObject->zItem()));
  73. result->addValue(
  74. "count", new Framework::JSON::JSONNumber((double)zObject->getCount()));
  75. return result;
  76. }
  77. JSONObjectValidationBuilder* ItemStackInfoType::addToValidator(
  78. JSONObjectValidationBuilder* builder) const
  79. {
  80. return builder
  81. ->withRequiredAttribute(
  82. "item", Game::INSTANCE->zTypeRegistry()->getValidator<Item>())
  83. ->withRequiredNumber("count")
  84. ->withDefault(1.0)
  85. ->whichIsGreaterOrEqual(1.0)
  86. ->finishNumber();
  87. }
  88. QuestRewardGiveItems::QuestRewardGiveItems()
  89. : QuestReward()
  90. {}
  91. void QuestRewardGiveItems::giveReward(Framework::XML::Element* zParent,
  92. QuestStorage* zStorage,
  93. Entity* zTargetEntity)
  94. {
  95. Player* p = dynamic_cast<Player*>(zTargetEntity);
  96. if (p)
  97. {
  98. zStorage->putValue(
  99. (Framework::Text("reward_") += rewardId) += "_given_to",
  100. new Framework::JSON::JSONString(p->getName()));
  101. }
  102. for (ItemStackInfo* info : items)
  103. {
  104. ItemStack* stack = new ItemStack(
  105. dynamic_cast<Item*>(info->zItem()->getThis()), info->getCount());
  106. zTargetEntity->unsaveAddItem(stack, Direction::NO_DIRECTION, 0);
  107. if (stack->getSize() > 0)
  108. {
  109. Game::INSTANCE->spawnItem(zTargetEntity->getLocation(),
  110. zTargetEntity->getDimensionId(),
  111. stack);
  112. }
  113. else
  114. {
  115. stack->release();
  116. }
  117. }
  118. }
  119. void QuestRewardGiveItems::addRewardUIML(
  120. UIMLContainerBuilder* zParent, QuestStorage* zStorage)
  121. {
  122. UIMLContainerBuilder* containerBuilder
  123. = UIMLBuilder::createContainer()
  124. ->setWidthPercentage(100)
  125. ->setHeightAuto()
  126. ->setDisplayAsColumn(0, 10)
  127. ->setStyle(Framework::Fenster::Style::Sichtbar
  128. | Framework::Fenster::Style::Erlaubt)
  129. ->setID(Framework::Text("reward_") += rewardId)
  130. ->addChild(UIMLBuilder::createTextAuto("Item Reward:")->build());
  131. for (ItemStackInfo* info : items)
  132. {
  133. containerBuilder->addChild(UIMLBuilder::createItemStack()
  134. ->setWidth(50)
  135. ->setHeight(50)
  136. ->setID(
  137. (Framework::Text("reward_") += rewardId) += "_item_stack")
  138. ->setAmount(info->getCount())
  139. ->setItemTypeID(info->zItem()->getTypeId())
  140. ->setToolTip(info->zItem()->getTooltipUIML())
  141. ->build());
  142. containerBuilder->addChild(UIMLBuilder::createTextAuto(
  143. (Framework::Text(info->getCount()) += " ")
  144. += info->zItem()->getName())
  145. ->setMarginLeft(10)
  146. ->setID((Framework::Text("reward_") += rewardId)
  147. += "_item_description")
  148. ->setAlignLeftToElement(
  149. (Framework::Text("reward_") += rewardId) += "_item_stack")
  150. ->setAlignYToElement(
  151. (Framework::Text("reward_") += rewardId) += "_item_stack")
  152. ->build());
  153. if (zStorage->containsKey(
  154. (Framework::Text("reward_") += rewardId) += "_given_to"))
  155. {
  156. auto name = zStorage
  157. ->zValue((Framework::Text("reward_") += rewardId)
  158. += "_given_to")
  159. ->asString();
  160. containerBuilder->addChild(UIMLBuilder::createTextAuto(
  161. Framework::Text("Given to: ") += name->getString())
  162. ->setMarginTop(10)
  163. ->setTextColor(0xFF00FF00)
  164. ->setAlignTopToElement(
  165. (Framework::Text("reward_") += rewardId)
  166. += "_item_description")
  167. ->setAlignXToElement(
  168. (Framework::Text("reward_") += rewardId)
  169. += "_item_description")
  170. ->build());
  171. }
  172. }
  173. zParent->addChild(containerBuilder->build());
  174. }
  175. QuestRewardGiveItemsType::QuestRewardGiveItemsType()
  176. : QuestRewardFactoryBase()
  177. {}
  178. QuestRewardGiveItems* QuestRewardGiveItemsType::createValue(
  179. Framework::JSON::JSONObject* zJson) const
  180. {
  181. return new QuestRewardGiveItems();
  182. }
  183. QuestRewardGiveItems* QuestRewardGiveItemsType::fromJson(
  184. Framework::JSON::JSONObject* zJson) const
  185. {
  186. QuestRewardGiveItems* result = QuestRewardFactoryBase::fromJson(zJson);
  187. Framework::JSON::JSONArray* itemsJson = zJson->zValue("items")->asArray();
  188. for (Framework::JSON::JSONValue* itemJson : *itemsJson)
  189. {
  190. result->items.add(
  191. Game::INSTANCE->zTypeRegistry()->fromJson<ItemStackInfo>(itemJson));
  192. }
  193. return result;
  194. }
  195. Framework::JSON::JSONObject* QuestRewardGiveItemsType::toJsonObject(
  196. QuestRewardGiveItems* zObject) const
  197. {
  198. Framework::JSON::JSONObject* zResult
  199. = QuestRewardFactoryBase::toJsonObject(zObject);
  200. zResult->addValue(
  201. "rewardId", new Framework::JSON::JSONString(zObject->getRewardId()));
  202. Framework::JSON::JSONArray* itemsJson = new Framework::JSON::JSONArray();
  203. for (ItemStackInfo* item : zObject->items)
  204. {
  205. itemsJson->addValue(Game::INSTANCE->zTypeRegistry()->toJson(item));
  206. }
  207. zResult->addValue("items", itemsJson);
  208. return zResult;
  209. }
  210. JSONObjectValidationBuilder* QuestRewardGiveItemsType::addToValidator(
  211. JSONObjectValidationBuilder* builder) const
  212. {
  213. return QuestRewardFactoryBase::addToValidator(
  214. builder->withRequiredArray("items")
  215. ->addAcceptedTypeInArray(
  216. Game::INSTANCE->zTypeRegistry()->getValidator<ItemStackInfo>())
  217. ->finishArray());
  218. }
  219. const char* QuestRewardGiveItemsType::getTypeToken() const
  220. {
  221. return "give_items";
  222. }