QuestReward.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. #include "QuestReward.h"
  2. #include <Fenster.h>
  3. #include "Entity.h"
  4. #include "Game.h"
  5. QuestReward::QuestReward(Framework::Text rewardId)
  6. : ReferenceCounter(),
  7. rewardId(rewardId)
  8. {}
  9. bool QuestReward::validateSettings(
  10. Framework::XML::Element* zParent, QuestStorage* zStorage)
  11. {
  12. return true;
  13. }
  14. void QuestReward::api(Framework::StreamReader* message,
  15. Framework::XML::Element* zParent,
  16. QuestStorage* zStorage)
  17. {}
  18. const Framework::Text& QuestReward::getRewardId() const
  19. {
  20. return rewardId;
  21. }
  22. ItemStackInfo::ItemStackInfo(Item* item, int count)
  23. : ReferenceCounter(),
  24. item(item),
  25. count(count)
  26. {}
  27. ItemStackInfo::~ItemStackInfo()
  28. {
  29. item->release();
  30. }
  31. Item* ItemStackInfo::zItem() const
  32. {
  33. return item;
  34. }
  35. int ItemStackInfo::getCount() const
  36. {
  37. return count;
  38. }
  39. ItemStackInfoType::ItemStackInfoType()
  40. : TypeFactory<ItemStackInfo>()
  41. {}
  42. ItemStackInfo* ItemStackInfoType::fromJson(
  43. Framework::JSON::JSONValue* zJson) const
  44. {
  45. return new ItemStackInfo(Game::INSTANCE->zTypeRegistry()->fromJson<Item>(
  46. zJson->asObject()->zValue("item")),
  47. (int)zJson->asObject()->zValue("count")->asNumber()->getNumber());
  48. }
  49. Framework::JSON::JSONValue* ItemStackInfoType::toJson(
  50. ItemStackInfo* zObject) const
  51. {
  52. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  53. result->addValue(
  54. "item", Game::INSTANCE->zTypeRegistry()->toJson(zObject->zItem()));
  55. result->addValue(
  56. "count", new Framework::JSON::JSONNumber((double)zObject->getCount()));
  57. return result;
  58. }
  59. Framework::JSON::Validator::JSONValidator*
  60. ItemStackInfoType::getValidator() const
  61. {
  62. return Framework::JSON::Validator::JSONValidator::buildForObject()
  63. ->withRequiredAttribute(
  64. "item", Game::INSTANCE->zTypeRegistry()->getValidator<Item>())
  65. ->withRequiredNumber("count")
  66. ->withDefault(1.0)
  67. ->whichIsGreaterOrEqual(1.0)
  68. ->finishNumber()
  69. ->finishObject();
  70. }
  71. QuestRewardGiveItems::QuestRewardGiveItems(Framework::Text rewardId)
  72. : QuestReward(rewardId)
  73. {}
  74. void QuestRewardGiveItems::giveReward(Entity* zTargetEntity)
  75. {
  76. for (ItemStackInfo* info : items)
  77. {
  78. ItemStack* stack = new ItemStack(
  79. dynamic_cast<Item*>(info->zItem()->getThis()), info->getCount());
  80. zTargetEntity->unsaveAddItem(stack, Direction::NO_DIRECTION, 0);
  81. if (stack->getSize() > 0)
  82. {
  83. Game::INSTANCE->spawnItem(zTargetEntity->getLocation(),
  84. zTargetEntity->getDimensionId(),
  85. stack);
  86. }
  87. else
  88. {
  89. stack->release();
  90. }
  91. }
  92. }
  93. void QuestRewardGiveItems::addRewardUIML(Framework::XML::Element* zParent,
  94. QuestStorage* zStorage,
  95. Framework::Text onClickPrefix)
  96. {
  97. Framework::XML::Element* container = new Framework::XML::Element(
  98. "<frame width=\"100%\" height=\"50\" display=\"column\" gap=\"10\"/>");
  99. container->setAttribute("style",
  100. Framework::Text() += (Framework::Fenster::Style::Sichtbar
  101. | Framework::Fenster::Style::Erlaubt));
  102. container->setAttribute("id", Framework::Text("reward_") += rewardId);
  103. container->addChild(
  104. new Framework::XML::Element("<text>Item Reward:</text>"));
  105. for (ItemStackInfo* info : items)
  106. {
  107. auto stack = new Framework::XML::Element(
  108. "<itemStack width=\"50\" height=\"50\"/>");
  109. stack->setAttribute(
  110. "id", (Framework::Text("reward_") += rewardId) += "_item_stack");
  111. stack->setAttribute("count", info->getCount());
  112. stack->addChild(
  113. new Framework::XML::Element(info->zItem()->getTooltipUIML()));
  114. auto text = new Framework::XML::Element("<text margin-left=\"10\"/>");
  115. text->setText(info->zItem()->getName());
  116. text->setAttribute("align-left", stack->getAttributeValue("id"));
  117. container->addChild(stack);
  118. }
  119. zParent->addChild(container);
  120. }
  121. QuestRewardGiveItemsType::QuestRewardGiveItemsType()
  122. : SubTypeFactory<QuestReward, QuestRewardGiveItems>()
  123. {}
  124. QuestRewardGiveItems* QuestRewardGiveItemsType::fromJson(
  125. Framework::JSON::JSONObject* zJson) const
  126. {
  127. QuestRewardGiveItems* result = new QuestRewardGiveItems(
  128. zJson->zValue("rewardId")->asString()->getString());
  129. Framework::JSON::JSONArray* itemsJson = zJson->zValue("items")->asArray();
  130. for (Framework::JSON::JSONValue* itemJson : *itemsJson)
  131. {
  132. result->items.add(
  133. Game::INSTANCE->zTypeRegistry()->fromJson<ItemStackInfo>(itemJson));
  134. }
  135. return result;
  136. }
  137. Framework::JSON::JSONObject* QuestRewardGiveItemsType::toJson(
  138. QuestRewardGiveItems* zObject) const
  139. {
  140. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  141. result->addValue(
  142. "rewardId", new Framework::JSON::JSONString(zObject->getRewardId()));
  143. Framework::JSON::JSONArray* itemsJson = new Framework::JSON::JSONArray();
  144. for (ItemStackInfo* item : zObject->items)
  145. {
  146. itemsJson->addValue(Game::INSTANCE->zTypeRegistry()->toJson(item));
  147. }
  148. result->addValue("items", itemsJson);
  149. return result;
  150. }
  151. Framework::JSON::Validator::JSONValidator*
  152. QuestRewardGiveItemsType::getValidator(
  153. Framework::JSON::Validator::ObjectValidationBuilder<
  154. Framework::JSON::Validator::JSONValidator>* builder) const
  155. {
  156. return builder->withRequiredString("rewardId")
  157. ->finishString()
  158. ->withRequiredArray("items")
  159. ->addAcceptedTypeInArray(
  160. Game::INSTANCE->zTypeRegistry()->getValidator<ItemStackInfo>())
  161. ->finishArray()
  162. ->finishObject();
  163. }
  164. Framework::Text QuestRewardGiveItemsType::getTypeToken() const
  165. {
  166. return "give_items";
  167. }