QuestRequirement.cpp 25 KB

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