QuestRequirement.cpp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772
  1. #include "QuestRequirement.h"
  2. #include <Fenster.h>
  3. #include "BlockType.h"
  4. #include "Game.h"
  5. #include "ItemFilter.h"
  6. #include "ItemType.h"
  7. #include "Quest.h"
  8. QuestRequirement::QuestRequirement()
  9. : ReferenceCounter()
  10. {}
  11. void QuestRequirement::api(Framework::StreamReader* message,
  12. Framework::XML::Element* zParent,
  13. QuestStorage* zStorage)
  14. {}
  15. void QuestRequirement::setRequirementId(Framework::Text id)
  16. {
  17. this->id = id;
  18. }
  19. const Framework::Text& QuestRequirement::getRequirementId() const
  20. {
  21. return id;
  22. }
  23. void QuestRequirement::setDescription(Framework::Text description)
  24. {
  25. this->description = description;
  26. }
  27. const Framework::Text& QuestRequirement::getDescription() const
  28. {
  29. return description;
  30. }
  31. QuestRequirementOpenDialog::QuestRequirementOpenDialog()
  32. : QuestRequirement()
  33. {}
  34. void QuestRequirementOpenDialog::processEvent(
  35. QuestEvent* zEvent, QuestStorage* zStorage)
  36. {
  37. QuestRequirementStorage* zRequirementStorage
  38. = zStorage->zStorage(getRequirementId());
  39. QuestEventOpenDialog* event = dynamic_cast<QuestEventOpenDialog*>(zEvent);
  40. if (event)
  41. {
  42. if (event->getDialogId() == dialogId)
  43. {
  44. zRequirementStorage->setFullfilled(true);
  45. }
  46. }
  47. }
  48. void QuestRequirementOpenDialog::addRequirementUIML(QuestStorage* zStorage,
  49. Framework::XML::Element* zParent,
  50. Framework::Text onClickPrefix)
  51. {
  52. Framework::XML::Element* container = new Framework::XML::Element(
  53. "<frame width=\"100%\" height=\"50\" display=\"row\" gap=\"10\"/>");
  54. container->setAttribute("style",
  55. Framework::Text() += (Framework::Fenster::Style::Sichtbar
  56. | Framework::Fenster::Style::Erlaubt));
  57. container->setAttribute(
  58. "id", Framework::Text("requirement_") += getRequirementId());
  59. // TODO: add icon of dialog
  60. auto text
  61. = new Framework::XML::Element("<text width=\"auto\" height=\"auto\"/>");
  62. text->setAttribute("id",
  63. Framework::Text("requirement_description_") += getRequirementId());
  64. text->setText(description);
  65. container->addChild(text);
  66. auto status = new Framework::XML::Element(
  67. "<text margin-top=\"10\" width=\"auto\" height=\"auto\"/>");
  68. status->setAttribute("align-top", text->getAttributeValue("id"));
  69. status->setAttribute("align-x", text->getAttributeValue("id"));
  70. if (zStorage->zStorage(getRequirementId())->isFullfilled())
  71. {
  72. status->setText("Completed");
  73. status->setAttribute("text-color", "0xFF00FF00");
  74. }
  75. else
  76. {
  77. status->setText("Not completed");
  78. status->setAttribute("text-color", "0xFFFF0000");
  79. }
  80. container->addChild(status);
  81. zParent->addChild(container);
  82. }
  83. void QuestRequirementOpenDialog::setDialogId(Framework::Text dialogId)
  84. {
  85. this->dialogId = dialogId;
  86. }
  87. const Framework::Text& QuestRequirementOpenDialog::getDialogId() const
  88. {
  89. return dialogId;
  90. }
  91. QuestRequirementOpenDialogType::QuestRequirementOpenDialogType()
  92. : QuestRequirementFactoryBase()
  93. {}
  94. QuestRequirementOpenDialog* QuestRequirementOpenDialogType::createValue(
  95. Framework::JSON::JSONObject* zJson) const
  96. {
  97. return new QuestRequirementOpenDialog();
  98. }
  99. QuestRequirementOpenDialog* QuestRequirementOpenDialogType::fromJson(
  100. Framework::JSON::JSONObject* zJson) const
  101. {
  102. QuestRequirementOpenDialog* result
  103. = QuestRequirementFactoryBase::fromJson(zJson);
  104. result->setDialogId(zJson->zValue("dialogId")->asString()->getString());
  105. return result;
  106. }
  107. Framework::JSON::JSONObject* QuestRequirementOpenDialogType::toJsonObject(
  108. QuestRequirementOpenDialog* zObject) const
  109. {
  110. Framework::JSON::JSONObject* result
  111. = QuestRequirementFactoryBase::toJsonObject(zObject);
  112. result->addValue(
  113. "dialogId", new Framework::JSON::JSONString(zObject->dialogId));
  114. return result;
  115. }
  116. JSONObjectValidationBuilder* QuestRequirementOpenDialogType::addToValidator(
  117. JSONObjectValidationBuilder* builder) const
  118. {
  119. return QuestRequirementFactoryBase::addToValidator(
  120. builder->withRequiredString("dialogId")->finishString());
  121. }
  122. const char* QuestRequirementOpenDialogType::getTypeToken() const
  123. {
  124. return "open_dialog";
  125. }
  126. QuestRequirementBlockBreak::QuestRequirementBlockBreak()
  127. : QuestRequirement(),
  128. blockTypeId(0),
  129. amount(1),
  130. usedItemTypeId(-1)
  131. {}
  132. void QuestRequirementBlockBreak::processEvent(
  133. QuestEvent* zEvent, QuestStorage* zStorage)
  134. {
  135. QuestEventBlockBreak* event = dynamic_cast<QuestEventBlockBreak*>(zEvent);
  136. if (event)
  137. {
  138. if (event->getBlockTypeId() == blockTypeId)
  139. {
  140. if (usedItemTypeId != -1
  141. && event->getUsedItemTypeId() != usedItemTypeId)
  142. {
  143. return;
  144. }
  145. int currentAmount = zStorage->containsKey(getRequirementId())
  146. ? (int)zStorage->zValue(getRequirementId())
  147. ->asNumber()
  148. ->getNumber()
  149. : 0;
  150. currentAmount += 1;
  151. zStorage->putValue(getRequirementId(),
  152. new Framework::JSON::JSONNumber(currentAmount));
  153. if (currentAmount >= amount)
  154. {
  155. zStorage->zStorage(getRequirementId())->setFullfilled(true);
  156. }
  157. }
  158. }
  159. }
  160. void QuestRequirementBlockBreak::addRequirementUIML(QuestStorage* zStorage,
  161. Framework::XML::Element* zParent,
  162. Framework::Text onClickPrefix)
  163. {
  164. Framework::XML::Element* container = new Framework::XML::Element(
  165. "<frame width=\"100%\" height=\"50\" display=\"row\" gap=\"10\"/>");
  166. container->setAttribute("style",
  167. Framework::Text() += (Framework::Fenster::Style::Sichtbar
  168. | Framework::Fenster::Style::Erlaubt));
  169. container->setAttribute(
  170. "id", Framework::Text("requirement_") += getRequirementId());
  171. // TODO: add icon of block
  172. auto text
  173. = new Framework::XML::Element("<text width=\"auto\" height=\"auto\"/>");
  174. text->setAttribute("id",
  175. Framework::Text("requirement_description_") += getRequirementId());
  176. text->setText(description);
  177. container->addChild(text);
  178. auto status = new Framework::XML::Element(
  179. "<text margin-top=\"10\" width=\"auto\" height=\"auto\"/>");
  180. status->setAttribute("align-top", text->getAttributeValue("id"));
  181. status->setAttribute("align-x", text->getAttributeValue("id"));
  182. if (zStorage->zStorage(getRequirementId())->isFullfilled())
  183. {
  184. Framework::Text completedText = "Completed (";
  185. completedText.append() << amount << "/" << amount << ")";
  186. status->setText(completedText.getText());
  187. status->setAttribute("text-color", "0xFF00FF00");
  188. }
  189. else
  190. {
  191. int currentAmount = zStorage->containsKey(getRequirementId())
  192. ? (int)zStorage->zValue(getRequirementId())
  193. ->asNumber()
  194. ->getNumber()
  195. : 0;
  196. Framework::Text completedText = "Not completed (";
  197. completedText.append() << currentAmount << "/" << amount << ")";
  198. status->setAttribute("text-color", "0xFFFF0000");
  199. }
  200. container->addChild(status);
  201. zParent->addChild(container);
  202. }
  203. void QuestRequirementBlockBreak::setBlockTypeId(int blockTypeId)
  204. {
  205. this->blockTypeId = blockTypeId;
  206. }
  207. int QuestRequirementBlockBreak::getBlockTypeId() const
  208. {
  209. return blockTypeId;
  210. }
  211. void QuestRequirementBlockBreak::setAmount(int amount)
  212. {
  213. this->amount = amount;
  214. }
  215. int QuestRequirementBlockBreak::getAmount() const
  216. {
  217. return amount;
  218. }
  219. void QuestRequirementBlockBreak::setUsedItemTypeId(int usedItemTypeId)
  220. {
  221. this->usedItemTypeId = usedItemTypeId;
  222. }
  223. int QuestRequirementBlockBreak::getUsedItemTypeId() const
  224. {
  225. return usedItemTypeId;
  226. }
  227. QuestRequirementBlockBreakType::QuestRequirementBlockBreakType()
  228. : QuestRequirementFactoryBase()
  229. {}
  230. QuestRequirementBlockBreak* QuestRequirementBlockBreakType::createValue(
  231. Framework::JSON::JSONObject* zJson) const
  232. {
  233. return new QuestRequirementBlockBreak();
  234. }
  235. QuestRequirementBlockBreak* QuestRequirementBlockBreakType::fromJson(
  236. Framework::JSON::JSONObject* zJson) const
  237. {
  238. QuestRequirementBlockBreak* result
  239. = QuestRequirementFactoryBase::fromJson(zJson);
  240. result->setBlockTypeId(Game::INSTANCE->getBlockTypeId(
  241. zJson->zValue("blockType")->asString()->getString()));
  242. result->setAmount((int)zJson->zValue("amount")->asNumber()->getNumber());
  243. if (zJson->hasValue("usedItemTypeId"))
  244. {
  245. result->setUsedItemTypeId(Game::INSTANCE->getItemTypeId(
  246. zJson->zValue("usedItemType")->asString()->getString()));
  247. }
  248. else
  249. {
  250. result->setUsedItemTypeId(-1);
  251. }
  252. return result;
  253. }
  254. Framework::JSON::JSONObject* QuestRequirementBlockBreakType::toJsonObject(
  255. QuestRequirementBlockBreak* zObject) const
  256. {
  257. Framework::JSON::JSONObject* result
  258. = QuestRequirementFactoryBase::toJsonObject(zObject);
  259. result->addValue("blockType",
  260. new Framework::JSON::JSONString(
  261. Game::INSTANCE->zBlockType(zObject->getBlockTypeId())->getName()));
  262. result->addValue("amount",
  263. new Framework::JSON::JSONNumber((double)zObject->getAmount()));
  264. if (zObject->getUsedItemTypeId() != -1)
  265. {
  266. result->addValue("usedItemType",
  267. new Framework::JSON::JSONString(
  268. Game::INSTANCE->zItemType(zObject->getUsedItemTypeId())
  269. ->getName()));
  270. }
  271. return result;
  272. }
  273. JSONObjectValidationBuilder* QuestRequirementBlockBreakType::addToValidator(
  274. JSONObjectValidationBuilder* builder) const
  275. {
  276. return QuestRequirementFactoryBase::addToValidator(builder
  277. ->withRequiredAttribute("blockType",
  278. Game::INSTANCE->zTypeRegistry()->getValidator<Framework::Text>(
  279. BlockTypeNameFactory::TYPE_ID))
  280. ->withRequiredNumber("amount")
  281. ->whichIsGreaterOrEqual(1.0)
  282. ->withDefault(1.0)
  283. ->finishNumber()
  284. ->withOptionalAttribute("usedItemType",
  285. Game::INSTANCE->zTypeRegistry()->getValidator<Framework::Text>(
  286. ItemTypeNameFactory::TYPE_ID)));
  287. }
  288. const char* QuestRequirementBlockBreakType::getTypeToken() const
  289. {
  290. return "block_break";
  291. }
  292. QuestRequirementBlockPlace::QuestRequirementBlockPlace()
  293. : QuestRequirement(),
  294. blockTypeId(0),
  295. amount(1)
  296. {}
  297. void QuestRequirementBlockPlace::processEvent(
  298. QuestEvent* zEvent, QuestStorage* zStorage)
  299. {
  300. QuestEventBlockPlace* event = dynamic_cast<QuestEventBlockPlace*>(zEvent);
  301. if (event)
  302. {
  303. if (event->getBlockTypeId() == blockTypeId)
  304. {
  305. int currentAmount = zStorage->containsKey(getRequirementId())
  306. ? (int)zStorage->zValue(getRequirementId())
  307. ->asNumber()
  308. ->getNumber()
  309. : 0;
  310. currentAmount += 1;
  311. zStorage->putValue(getRequirementId(),
  312. new Framework::JSON::JSONNumber(currentAmount));
  313. if (currentAmount >= amount)
  314. {
  315. zStorage->zStorage(getRequirementId())->setFullfilled(true);
  316. }
  317. }
  318. }
  319. }
  320. void QuestRequirementBlockPlace::addRequirementUIML(QuestStorage* zStorage,
  321. Framework::XML::Element* zParent,
  322. Framework::Text onClickPrefix)
  323. {
  324. Framework::XML::Element* container = new Framework::XML::Element(
  325. "<frame width=\"100%\" height=\"50\" display=\"row\" gap=\"10\"/>");
  326. container->setAttribute("style",
  327. Framework::Text() += (Framework::Fenster::Style::Sichtbar
  328. | Framework::Fenster::Style::Erlaubt));
  329. container->setAttribute(
  330. "id", Framework::Text("requirement_") += getRequirementId());
  331. // TODO: add icon of block
  332. auto text
  333. = new Framework::XML::Element("<text width=\"auto\" height=\"auto\"/>");
  334. text->setAttribute("id",
  335. Framework::Text("requirement_description_") += getRequirementId());
  336. text->setText(description);
  337. container->addChild(text);
  338. auto status = new Framework::XML::Element(
  339. "<text margin-top=\"10\" width=\"auto\" height=\"auto\"/>");
  340. status->setAttribute("align-top", text->getAttributeValue("id"));
  341. status->setAttribute("align-x", text->getAttributeValue("id"));
  342. if (zStorage->zStorage(getRequirementId())->isFullfilled())
  343. {
  344. Framework::Text completedText = "Completed (";
  345. completedText.append() << amount << "/" << amount << ")";
  346. status->setText(completedText.getText());
  347. status->setAttribute("text-color", "0xFF00FF00");
  348. }
  349. else
  350. {
  351. int currentAmount = zStorage->containsKey(getRequirementId())
  352. ? (int)zStorage->zValue(getRequirementId())
  353. ->asNumber()
  354. ->getNumber()
  355. : 0;
  356. Framework::Text completedText = "Not completed (";
  357. completedText.append() << currentAmount << "/" << amount << ")";
  358. status->setAttribute("text-color", "0xFFFF0000");
  359. }
  360. container->addChild(status);
  361. zParent->addChild(container);
  362. }
  363. void QuestRequirementBlockPlace::setBlockTypeId(int blockTypeId)
  364. {
  365. this->blockTypeId = blockTypeId;
  366. }
  367. int QuestRequirementBlockPlace::getBlockTypeId() const
  368. {
  369. return blockTypeId;
  370. }
  371. void QuestRequirementBlockPlace::setAmount(int amount)
  372. {
  373. this->amount = amount;
  374. }
  375. int QuestRequirementBlockPlace::getAmount() const
  376. {
  377. return amount;
  378. }
  379. QuestRequirementBlockPlaceType::QuestRequirementBlockPlaceType()
  380. : QuestRequirementFactoryBase()
  381. {}
  382. QuestRequirementBlockPlace* QuestRequirementBlockPlaceType::createValue(
  383. Framework::JSON::JSONObject* zJson) const
  384. {
  385. return new QuestRequirementBlockPlace();
  386. }
  387. QuestRequirementBlockPlace* QuestRequirementBlockPlaceType::fromJson(
  388. Framework::JSON::JSONObject* zJson) const
  389. {
  390. QuestRequirementBlockPlace* result
  391. = QuestRequirementFactoryBase::fromJson(zJson);
  392. result->setBlockTypeId(Game::INSTANCE->getBlockTypeId(
  393. zJson->zValue("blockType")->asString()->getString()));
  394. result->setAmount((int)zJson->zValue("amount")->asNumber()->getNumber());
  395. return result;
  396. }
  397. Framework::JSON::JSONObject* QuestRequirementBlockPlaceType::toJsonObject(
  398. QuestRequirementBlockPlace* zObject) const
  399. {
  400. Framework::JSON::JSONObject* result
  401. = QuestRequirementFactoryBase::toJsonObject(zObject);
  402. result->addValue("blockType",
  403. new Framework::JSON::JSONString(
  404. Game::INSTANCE->zBlockType(zObject->getBlockTypeId())->getName()));
  405. result->addValue("amount",
  406. new Framework::JSON::JSONNumber((double)zObject->getAmount()));
  407. return result;
  408. }
  409. JSONObjectValidationBuilder* QuestRequirementBlockPlaceType::addToValidator(
  410. JSONObjectValidationBuilder* builder) const
  411. {
  412. return QuestRequirementFactoryBase::addToValidator(builder
  413. ->withRequiredAttribute("blockType",
  414. Game::INSTANCE->zTypeRegistry()->getValidator<Framework::Text>(
  415. BlockTypeNameFactory::TYPE_ID))
  416. ->withRequiredNumber("amount")
  417. ->whichIsGreaterOrEqual(1.0)
  418. ->withDefault(1.0)
  419. ->finishNumber());
  420. }
  421. const char* QuestRequirementBlockPlaceType::getTypeToken() const
  422. {
  423. return "block_place";
  424. }
  425. QuestRequirementBlockInteract::QuestRequirementBlockInteract()
  426. : QuestRequirement(),
  427. blockTypeId(0),
  428. itemTypeId(-1)
  429. {}
  430. void QuestRequirementBlockInteract::processEvent(
  431. QuestEvent* zEvent, QuestStorage* zStorage)
  432. {
  433. QuestEventBlockInteract* event
  434. = dynamic_cast<QuestEventBlockInteract*>(zEvent);
  435. if (event)
  436. {
  437. if (event->getBlockTypeId() == blockTypeId)
  438. {
  439. if (itemTypeId != -1 && event->getUsedItemTypeId() != itemTypeId)
  440. {
  441. return;
  442. }
  443. QuestRequirementStorage* zRequirementStorage
  444. = zStorage->zStorage(getRequirementId());
  445. zRequirementStorage->setFullfilled(true);
  446. }
  447. }
  448. }
  449. void QuestRequirementBlockInteract::addRequirementUIML(QuestStorage* zStorage,
  450. Framework::XML::Element* zParent,
  451. Framework::Text onClickPrefix)
  452. {
  453. Framework::XML::Element* container = new Framework::XML::Element(
  454. "<frame width=\"100%\" height=\"50\" display=\"row\" gap=\"10\"/>");
  455. container->setAttribute("style",
  456. Framework::Text() += (Framework::Fenster::Style::Sichtbar
  457. | Framework::Fenster::Style::Erlaubt));
  458. container->setAttribute(
  459. "id", Framework::Text("requirement_") += getRequirementId());
  460. // TODO: add icon of block
  461. auto text
  462. = new Framework::XML::Element("<text width=\"auto\" height=\"auto\"/>");
  463. text->setAttribute("id",
  464. Framework::Text("requirement_description_") += getRequirementId());
  465. text->setText(description);
  466. container->addChild(text);
  467. auto status = new Framework::XML::Element(
  468. "<text margin-top=\"10\" width=\"auto\" height=\"auto\"/>");
  469. status->setAttribute("align-top", text->getAttributeValue("id"));
  470. status->setAttribute("align-x", text->getAttributeValue("id"));
  471. if (zStorage->zStorage(getRequirementId())->isFullfilled())
  472. {
  473. status->setText("Completed");
  474. status->setAttribute("text-color", "0xFF00FF00");
  475. }
  476. else
  477. {
  478. status->setText("Not completed");
  479. status->setAttribute("text-color", "0xFFFF0000");
  480. }
  481. container->addChild(status);
  482. zParent->addChild(container);
  483. }
  484. void QuestRequirementBlockInteract::setBlockTypeId(int blockTypeId)
  485. {
  486. this->blockTypeId = blockTypeId;
  487. }
  488. int QuestRequirementBlockInteract::getBlockTypeId() const
  489. {
  490. return blockTypeId;
  491. }
  492. void QuestRequirementBlockInteract::setItemTypeId(int itemTypeId)
  493. {
  494. this->itemTypeId = itemTypeId;
  495. }
  496. int QuestRequirementBlockInteract::getItemTypeId() const
  497. {
  498. return itemTypeId;
  499. }
  500. QuestRequirementBlockInteractType::QuestRequirementBlockInteractType()
  501. : QuestRequirementFactoryBase()
  502. {}
  503. QuestRequirementBlockInteract* QuestRequirementBlockInteractType::createValue(
  504. Framework::JSON::JSONObject* zJson) const
  505. {
  506. return new QuestRequirementBlockInteract();
  507. }
  508. QuestRequirementBlockInteract* QuestRequirementBlockInteractType::fromJson(
  509. Framework::JSON::JSONObject* zJson) const
  510. {
  511. QuestRequirementBlockInteract* result
  512. = QuestRequirementFactoryBase::fromJson(zJson);
  513. result->setBlockTypeId(Game::INSTANCE->getBlockTypeId(
  514. zJson->zValue("blockType")->asString()->getString()));
  515. if (zJson->hasValue("itemType"))
  516. {
  517. result->setItemTypeId(Game::INSTANCE->getItemTypeId(
  518. zJson->zValue("itemType")->asString()->getString()));
  519. }
  520. else
  521. {
  522. result->setItemTypeId(-1);
  523. }
  524. return result;
  525. }
  526. Framework::JSON::JSONObject* QuestRequirementBlockInteractType::toJsonObject(
  527. QuestRequirementBlockInteract* zObject) const
  528. {
  529. Framework::JSON::JSONObject* result
  530. = QuestRequirementFactoryBase::toJsonObject(zObject);
  531. result->addValue("blockType",
  532. new Framework::JSON::JSONString(
  533. Game::INSTANCE->zBlockType(zObject->getBlockTypeId())->getName()));
  534. if (zObject->getItemTypeId() != -1)
  535. {
  536. result->addValue("itemType",
  537. new Framework::JSON::JSONString(
  538. Game::INSTANCE->zItemType(zObject->getItemTypeId())
  539. ->getName()));
  540. }
  541. return result;
  542. }
  543. JSONObjectValidationBuilder* QuestRequirementBlockInteractType::addToValidator(
  544. JSONObjectValidationBuilder* builder) const
  545. {
  546. return QuestRequirementFactoryBase::addToValidator(builder
  547. ->withRequiredAttribute("blockType",
  548. Game::INSTANCE->zTypeRegistry()->getValidator<Framework::Text>(
  549. BlockTypeNameFactory::TYPE_ID))
  550. ->withOptionalAttribute("itemType",
  551. Game::INSTANCE->zTypeRegistry()->getValidator<Framework::Text>(
  552. ItemTypeNameFactory::TYPE_ID)));
  553. }
  554. const char* QuestRequirementBlockInteractType::getTypeToken() const
  555. {
  556. return "block_interact";
  557. }
  558. QuestRequirementItemInInventory::QuestRequirementItemInInventory()
  559. : QuestRequirement(),
  560. itemTypeId(0),
  561. amount(1)
  562. {}
  563. void QuestRequirementItemInInventory::processEvent(
  564. QuestEvent* zEvent, QuestStorage* zStorage)
  565. {
  566. QuestEventItemPickup* event = dynamic_cast<QuestEventItemPickup*>(zEvent);
  567. if (event)
  568. {
  569. if (event->getItemTypeId() == itemTypeId)
  570. {
  571. TypeItemFilter filter;
  572. filter.setType(Game::INSTANCE->zItemType(itemTypeId));
  573. int current = event->zActingEntity()->countAccessableItems(
  574. &filter, Direction::NO_DIRECTION);
  575. int currentAmount = zStorage->containsKey(getRequirementId())
  576. ? (int)zStorage->zValue(getRequirementId())
  577. ->asNumber()
  578. ->getNumber()
  579. : 0;
  580. if (currentAmount < current)
  581. {
  582. currentAmount = current;
  583. }
  584. zStorage->putValue(getRequirementId(),
  585. new Framework::JSON::JSONNumber(currentAmount));
  586. if (currentAmount >= amount)
  587. {
  588. zStorage->zStorage(getRequirementId())->setFullfilled(true);
  589. }
  590. }
  591. }
  592. }
  593. void QuestRequirementItemInInventory::addRequirementUIML(QuestStorage* zStorage,
  594. Framework::XML::Element* zParent,
  595. Framework::Text onClickPrefix)
  596. {
  597. Framework::XML::Element* container = new Framework::XML::Element(
  598. "<frame width=\"100%\" height=\"50\" display=\"row\" gap=\"10\"/>");
  599. container->setAttribute("style",
  600. Framework::Text() += (Framework::Fenster::Style::Sichtbar
  601. | Framework::Fenster::Style::Erlaubt));
  602. container->setAttribute(
  603. "id", Framework::Text("requirement_") += getRequirementId());
  604. // TODO: add icon of item
  605. auto text
  606. = new Framework::XML::Element("<text width=\"auto\" height=\"auto\"/>");
  607. text->setAttribute("id",
  608. Framework::Text("requirement_description_") += getRequirementId());
  609. text->setText(description);
  610. container->addChild(text);
  611. auto status = new Framework::XML::Element(
  612. "<text margin-top=\"10\" width=\"auto\" height=\"auto\"/>");
  613. status->setAttribute("align-top", text->getAttributeValue("id"));
  614. status->setAttribute("align-x", text->getAttributeValue("id"));
  615. if (zStorage->zStorage(getRequirementId())->isFullfilled())
  616. {
  617. Framework::Text completedText = "Completed (";
  618. completedText.append() << amount << "/" << amount << ")";
  619. status->setText(completedText.getText());
  620. status->setAttribute("text-color", "0xFF00FF00");
  621. }
  622. else
  623. {
  624. int currentAmount = zStorage->containsKey(getRequirementId())
  625. ? (int)zStorage->zValue(getRequirementId())
  626. ->asNumber()
  627. ->getNumber()
  628. : 0;
  629. Framework::Text completedText = "Not completed (";
  630. completedText.append() << currentAmount << "/" << amount << ")";
  631. status->setAttribute("text-color", "0xFFFF0000");
  632. }
  633. container->addChild(status);
  634. zParent->addChild(container);
  635. }
  636. void QuestRequirementItemInInventory::setItemTypeId(int itemTypeId)
  637. {
  638. this->itemTypeId = itemTypeId;
  639. }
  640. int QuestRequirementItemInInventory::getItemTypeId() const
  641. {
  642. return itemTypeId;
  643. }
  644. void QuestRequirementItemInInventory::setAmount(int amount)
  645. {
  646. this->amount = amount;
  647. }
  648. int QuestRequirementItemInInventory::getAmount() const
  649. {
  650. return amount;
  651. }
  652. QuestRequirementItemInInventoryType::QuestRequirementItemInInventoryType()
  653. : QuestRequirementFactoryBase()
  654. {}
  655. QuestRequirementItemInInventory*
  656. QuestRequirementItemInInventoryType::createValue(
  657. Framework::JSON::JSONObject* zJson) const
  658. {
  659. return new QuestRequirementItemInInventory();
  660. }
  661. QuestRequirementItemInInventory* QuestRequirementItemInInventoryType::fromJson(
  662. Framework::JSON::JSONObject* zJson) const
  663. {
  664. QuestRequirementItemInInventory* result
  665. = QuestRequirementFactoryBase::fromJson(zJson);
  666. result->setItemTypeId(Game::INSTANCE->getItemTypeId(
  667. zJson->zValue("itemType")->asString()->getString()));
  668. result->setAmount((int)zJson->zValue("amount")->asNumber()->getNumber());
  669. return result;
  670. }
  671. Framework::JSON::JSONObject* QuestRequirementItemInInventoryType::toJsonObject(
  672. QuestRequirementItemInInventory* zObject) const
  673. {
  674. Framework::JSON::JSONObject* result
  675. = QuestRequirementFactoryBase::toJsonObject(zObject);
  676. result->addValue("itemType",
  677. new Framework::JSON::JSONString(
  678. Game::INSTANCE->zItemType(zObject->getItemTypeId())->getName()));
  679. result->addValue("amount",
  680. new Framework::JSON::JSONNumber((double)zObject->getAmount()));
  681. return result;
  682. }
  683. JSONObjectValidationBuilder*
  684. QuestRequirementItemInInventoryType::addToValidator(
  685. JSONObjectValidationBuilder* builder) const
  686. {
  687. return QuestRequirementFactoryBase::addToValidator(builder
  688. ->withRequiredAttribute("itemType",
  689. Game::INSTANCE->zTypeRegistry()->getValidator<Framework::Text>(
  690. ItemTypeNameFactory::TYPE_ID))
  691. ->withRequiredNumber("amount")
  692. ->whichIsGreaterOrEqual(1.0)
  693. ->withDefault(1.0)
  694. ->finishNumber());
  695. }
  696. const char* QuestRequirementItemInInventoryType::getTypeToken() const
  697. {
  698. return "item_in_inventory";
  699. }