QuestReward.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  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
  98. = new Framework::XML::Element("<frame width=\"100%\" height=\"auto\" "
  99. "display=\"column\" gap=\"10\"/>");
  100. container->setAttribute("style",
  101. Framework::Text() += (Framework::Fenster::Style::Sichtbar
  102. | Framework::Fenster::Style::Erlaubt));
  103. container->setAttribute("id", Framework::Text("reward_") += rewardId);
  104. container->addChild(new Framework::XML::Element(
  105. "<text width=\"auto\" height=\"auto\">Item Reward:</text>"));
  106. for (ItemStackInfo* info : items)
  107. {
  108. auto stack = new Framework::XML::Element(
  109. "<itemStack width=\"50\" height=\"50\"/>");
  110. stack->setAttribute(
  111. "id", (Framework::Text("reward_") += rewardId) += "_item_stack");
  112. stack->setAttribute("count", info->getCount());
  113. stack->setAttribute("type", info->zItem()->getTypeId());
  114. stack->addChild(
  115. new Framework::XML::Element(info->zItem()->getTooltipUIML()));
  116. auto text = new Framework::XML::Element(
  117. "<text margin-left=\"10\" width=\"auto\" height=\"auto\"/>");
  118. text->setText((Framework::Text(info->getCount()) += " ")
  119. += info->zItem()->getName());
  120. text->setAttribute("align-left", stack->getAttributeValue("id"));
  121. text->setAttribute("align-y", stack->getAttributeValue("id"));
  122. container->addChild(stack);
  123. container->addChild(text);
  124. }
  125. zParent->addChild(container);
  126. }
  127. QuestRewardGiveItemsType::QuestRewardGiveItemsType()
  128. : SubTypeFactory<QuestReward, QuestRewardGiveItems>()
  129. {}
  130. QuestRewardGiveItems* QuestRewardGiveItemsType::fromJson(
  131. Framework::JSON::JSONObject* zJson) const
  132. {
  133. QuestRewardGiveItems* result = new QuestRewardGiveItems(
  134. zJson->zValue("rewardId")->asString()->getString());
  135. Framework::JSON::JSONArray* itemsJson = zJson->zValue("items")->asArray();
  136. for (Framework::JSON::JSONValue* itemJson : *itemsJson)
  137. {
  138. result->items.add(
  139. Game::INSTANCE->zTypeRegistry()->fromJson<ItemStackInfo>(itemJson));
  140. }
  141. return result;
  142. }
  143. Framework::JSON::JSONObject* QuestRewardGiveItemsType::toJson(
  144. QuestRewardGiveItems* zObject) const
  145. {
  146. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  147. result->addValue(
  148. "rewardId", new Framework::JSON::JSONString(zObject->getRewardId()));
  149. Framework::JSON::JSONArray* itemsJson = new Framework::JSON::JSONArray();
  150. for (ItemStackInfo* item : zObject->items)
  151. {
  152. itemsJson->addValue(Game::INSTANCE->zTypeRegistry()->toJson(item));
  153. }
  154. result->addValue("items", itemsJson);
  155. return result;
  156. }
  157. Framework::JSON::Validator::JSONValidator*
  158. QuestRewardGiveItemsType::getValidator(
  159. Framework::JSON::Validator::ObjectValidationBuilder<
  160. Framework::JSON::Validator::JSONValidator>* builder) const
  161. {
  162. return builder->withRequiredString("rewardId")
  163. ->finishString()
  164. ->withRequiredArray("items")
  165. ->addAcceptedTypeInArray(
  166. Game::INSTANCE->zTypeRegistry()->getValidator<ItemStackInfo>())
  167. ->finishArray()
  168. ->finishObject();
  169. }
  170. Framework::Text QuestRewardGiveItemsType::getTypeToken() const
  171. {
  172. return "give_items";
  173. }