QuestReward.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  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. int index = 0;
  132. for (ItemStackInfo* info : items)
  133. {
  134. Framework::Text idPrefix;
  135. idPrefix.append() << "reward_" << rewardId << "_" << index;
  136. Framework::Text id;
  137. id.append() << idPrefix.getText() << "_item_stack";
  138. containerBuilder->addChild(UIMLBuilder::createItemStack()
  139. ->setWidth(50)
  140. ->setHeight(50)
  141. ->setID(id)
  142. ->setAmount(info->getCount())
  143. ->setItemTypeID(info->zItem()->getTypeId())
  144. ->setToolTip(info->zItem()->getTooltipUIML())
  145. ->build());
  146. containerBuilder->addChild(UIMLBuilder::createTextAuto(
  147. (Framework::Text(info->getCount()) += " ")
  148. += info->zItem()->getName())
  149. ->setMarginLeft(10)
  150. ->setID(idPrefix + "_item_description")
  151. ->setAlignLeftToElement(id)
  152. ->setAlignYToElement(id)
  153. ->build());
  154. if (zStorage->containsKey(idPrefix + "_given_to"))
  155. {
  156. auto name = zStorage->zValue(idPrefix + "_given_to")
  157. ->asString();
  158. containerBuilder->addChild(UIMLBuilder::createTextAuto(
  159. Framework::Text("Given to: ") += name->getString())
  160. ->setMarginTop(10)
  161. ->setTextColor(0xFF00FF00)
  162. ->setAlignTopToElement(idPrefix + "_item_description")
  163. ->setAlignXToElement(idPrefix + "_item_description")
  164. ->build());
  165. }
  166. index++;
  167. }
  168. zParent->addChild(containerBuilder->build());
  169. }
  170. QuestRewardGiveItemsType::QuestRewardGiveItemsType()
  171. : QuestRewardFactoryBase()
  172. {}
  173. QuestRewardGiveItems* QuestRewardGiveItemsType::createValue(
  174. Framework::JSON::JSONObject* zJson) const
  175. {
  176. return new QuestRewardGiveItems();
  177. }
  178. QuestRewardGiveItems* QuestRewardGiveItemsType::fromJson(
  179. Framework::JSON::JSONObject* zJson) const
  180. {
  181. QuestRewardGiveItems* result = QuestRewardFactoryBase::fromJson(zJson);
  182. Framework::JSON::JSONArray* itemsJson = zJson->zValue("items")->asArray();
  183. for (Framework::JSON::JSONValue* itemJson : *itemsJson)
  184. {
  185. result->items.add(
  186. Game::INSTANCE->zTypeRegistry()->fromJson<ItemStackInfo>(itemJson));
  187. }
  188. return result;
  189. }
  190. Framework::JSON::JSONObject* QuestRewardGiveItemsType::toJsonObject(
  191. QuestRewardGiveItems* zObject) const
  192. {
  193. Framework::JSON::JSONObject* zResult
  194. = QuestRewardFactoryBase::toJsonObject(zObject);
  195. zResult->addValue(
  196. "rewardId", new Framework::JSON::JSONString(zObject->getRewardId()));
  197. Framework::JSON::JSONArray* itemsJson = new Framework::JSON::JSONArray();
  198. for (ItemStackInfo* item : zObject->items)
  199. {
  200. itemsJson->addValue(Game::INSTANCE->zTypeRegistry()->toJson(item));
  201. }
  202. zResult->addValue("items", itemsJson);
  203. return zResult;
  204. }
  205. JSONObjectValidationBuilder* QuestRewardGiveItemsType::addToValidator(
  206. JSONObjectValidationBuilder* builder) const
  207. {
  208. return QuestRewardFactoryBase::addToValidator(
  209. builder->withRequiredArray("items")
  210. ->addAcceptedTypeInArray(
  211. Game::INSTANCE->zTypeRegistry()->getValidator<ItemStackInfo>())
  212. ->finishArray());
  213. }
  214. const char* QuestRewardGiveItemsType::getTypeToken() const
  215. {
  216. return "give_items";
  217. }