QuestRequirement.cpp 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883
  1. #include "QuestRequirement.h"
  2. #include <Window.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::Window::Style::Visible
  58. | Framework::Window::Style::Allowed)
  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::Window::Style::Visible
  176. | Framework::Window::Style::Allowed)
  177. ->setID(Framework::Text("requirement_") += getRequirementId());
  178. int itemTypeId = Game::INSTANCE->zBlockType(blockTypeId)->getItemTypeId();
  179. if (itemTypeId > 0)
  180. {
  181. builder->addChild(UIMLBuilder::createItemStack()
  182. ->setItemTypeID(itemTypeId)
  183. ->setAmount(1)
  184. ->setID(Framework::Text("requirement_itemStack_")
  185. += getRequirementId())
  186. ->setWidth(50)
  187. ->setHeight(50)
  188. ->setToolTip(
  189. Game::INSTANCE->zItemType(itemTypeId)->getTooltipUIML())
  190. ->build());
  191. }
  192. Framework::Text status;
  193. int color;
  194. if (zStorage->zStorage(getRequirementId())->isFullfilled())
  195. {
  196. status = "Completed (";
  197. status.append() << amount << "/" << amount << ")";
  198. color = 0xFF00FF00;
  199. }
  200. else
  201. {
  202. int currentAmount = zStorage->containsKey(getRequirementId())
  203. ? (int)zStorage->zValue(getRequirementId())
  204. ->asNumber()
  205. ->getNumber()
  206. : 0;
  207. status = "Not completed (";
  208. status.append() << currentAmount << "/" << amount << ")";
  209. color = 0xFFFF0000;
  210. }
  211. zParent->addChild(builder
  212. ->addChild(UIMLBuilder::createTextAuto(description)
  213. ->setID(Framework::Text("requirement_description_")
  214. += getRequirementId())
  215. ->setAlignLeftToElement(
  216. itemTypeId > 0
  217. ? Framework::Text("requirement_itemStack_")
  218. += getRequirementId()
  219. : Framework::Text("start"))
  220. ->setMarginLeft(10)
  221. ->build())
  222. ->addChild(UIMLBuilder::createTextAuto(status)
  223. ->setAlignXToElement(
  224. Framework::Text("requirement_description_")
  225. += getRequirementId())
  226. ->setAlignTopToElement(
  227. Framework::Text("requirement_description_")
  228. += getRequirementId())
  229. ->setMarginTop(10)
  230. ->setAlignXToElement(
  231. Framework::Text("requirement_description_")
  232. += getRequirementId())
  233. ->setTextColor(color)
  234. ->build())
  235. ->build());
  236. }
  237. void QuestRequirementBlockBreak::setBlockTypeId(int blockTypeId)
  238. {
  239. this->blockTypeId = blockTypeId;
  240. }
  241. int QuestRequirementBlockBreak::getBlockTypeId() const
  242. {
  243. return blockTypeId;
  244. }
  245. void QuestRequirementBlockBreak::setAmount(int amount)
  246. {
  247. this->amount = amount;
  248. }
  249. int QuestRequirementBlockBreak::getAmount() const
  250. {
  251. return amount;
  252. }
  253. void QuestRequirementBlockBreak::setUsedItemTypeId(int usedItemTypeId)
  254. {
  255. this->usedItemTypeId = usedItemTypeId;
  256. }
  257. int QuestRequirementBlockBreak::getUsedItemTypeId() const
  258. {
  259. return usedItemTypeId;
  260. }
  261. QuestRequirementBlockBreakType::QuestRequirementBlockBreakType()
  262. : QuestRequirementFactoryBase()
  263. {}
  264. QuestRequirementBlockBreak* QuestRequirementBlockBreakType::createValue(
  265. Framework::JSON::JSONObject* zJson) const
  266. {
  267. return new QuestRequirementBlockBreak();
  268. }
  269. QuestRequirementBlockBreak* QuestRequirementBlockBreakType::fromJson(
  270. Framework::JSON::JSONObject* zJson) const
  271. {
  272. QuestRequirementBlockBreak* result
  273. = QuestRequirementFactoryBase::fromJson(zJson);
  274. result->setBlockTypeId(Game::INSTANCE->getBlockTypeId(
  275. zJson->zValue("blockType")->asString()->getString()));
  276. result->setAmount((int)zJson->zValue("amount")->asNumber()->getNumber());
  277. if (zJson->hasValue("usedItemTypeId"))
  278. {
  279. result->setUsedItemTypeId(Game::INSTANCE->getItemTypeId(
  280. zJson->zValue("usedItemType")->asString()->getString()));
  281. }
  282. else
  283. {
  284. result->setUsedItemTypeId(-1);
  285. }
  286. return result;
  287. }
  288. Framework::JSON::JSONObject* QuestRequirementBlockBreakType::toJsonObject(
  289. QuestRequirementBlockBreak* zObject) const
  290. {
  291. Framework::JSON::JSONObject* result
  292. = QuestRequirementFactoryBase::toJsonObject(zObject);
  293. result->addValue("blockType",
  294. new Framework::JSON::JSONString(
  295. Game::INSTANCE->zBlockType(zObject->getBlockTypeId())->getName()));
  296. result->addValue("amount",
  297. new Framework::JSON::JSONNumber((double)zObject->getAmount()));
  298. if (zObject->getUsedItemTypeId() != -1)
  299. {
  300. result->addValue("usedItemType",
  301. new Framework::JSON::JSONString(
  302. Game::INSTANCE->zItemType(zObject->getUsedItemTypeId())
  303. ->getName()));
  304. }
  305. return result;
  306. }
  307. JSONObjectValidationBuilder* QuestRequirementBlockBreakType::addToValidator(
  308. JSONObjectValidationBuilder* builder) const
  309. {
  310. return QuestRequirementFactoryBase::addToValidator(builder
  311. ->withRequiredAttribute("blockType",
  312. Game::INSTANCE->zTypeRegistry()->getValidator<Framework::Text>(
  313. BlockTypeNameFactory::TYPE_ID))
  314. ->withRequiredNumber("amount")
  315. ->whichIsGreaterOrEqual(1.0)
  316. ->withDefault(1.0)
  317. ->finishNumber()
  318. ->withOptionalAttribute("usedItemType",
  319. Game::INSTANCE->zTypeRegistry()->getValidator<Framework::Text>(
  320. ItemTypeNameFactory::TYPE_ID)));
  321. }
  322. const char* QuestRequirementBlockBreakType::getTypeToken() const
  323. {
  324. return "block_break";
  325. }
  326. QuestRequirementBlockPlace::QuestRequirementBlockPlace()
  327. : QuestRequirement(),
  328. blockTypeId(0),
  329. amount(1)
  330. {}
  331. void QuestRequirementBlockPlace::processEvent(
  332. QuestEvent* zEvent, QuestStorage* zStorage)
  333. {
  334. QuestEventBlockPlace* event = dynamic_cast<QuestEventBlockPlace*>(zEvent);
  335. if (event)
  336. {
  337. if (event->getBlockTypeId() == blockTypeId)
  338. {
  339. int currentAmount = zStorage->containsKey(getRequirementId())
  340. ? (int)zStorage->zValue(getRequirementId())
  341. ->asNumber()
  342. ->getNumber()
  343. : 0;
  344. currentAmount += 1;
  345. zStorage->putValue(getRequirementId(),
  346. new Framework::JSON::JSONNumber(currentAmount));
  347. if (currentAmount >= amount)
  348. {
  349. zStorage->zStorage(getRequirementId())->setFullfilled(true);
  350. }
  351. }
  352. }
  353. }
  354. void QuestRequirementBlockPlace::addRequirementUIML(
  355. QuestStorage* zStorage, UIMLContainerBuilder* zParent)
  356. {
  357. UIMLContainerBuilder* builder
  358. = UIMLBuilder::createContainer()
  359. ->setWidthPercentage(100)
  360. ->setHeight(50)
  361. ->setDisplayAsRow(0, 10)
  362. ->setStyle(Framework::Window::Style::Visible
  363. | Framework::Window::Style::Allowed)
  364. ->setID(Framework::Text("requirement_") += getRequirementId());
  365. int itemTypeId = Game::INSTANCE->zBlockType(blockTypeId)->getItemTypeId();
  366. if (itemTypeId > 0)
  367. {
  368. builder->addChild(UIMLBuilder::createItemStack()
  369. ->setItemTypeID(itemTypeId)
  370. ->setAmount(1)
  371. ->setID(Framework::Text("requirement_itemStack_")
  372. += getRequirementId())
  373. ->setWidth(50)
  374. ->setHeight(50)
  375. ->setToolTip(
  376. Game::INSTANCE->zItemType(itemTypeId)->getTooltipUIML())
  377. ->build());
  378. }
  379. Framework::Text status;
  380. int color;
  381. if (zStorage->zStorage(getRequirementId())->isFullfilled())
  382. {
  383. status = "Completed (";
  384. status.append() << amount << "/" << amount << ")";
  385. color = 0xFF00FF00;
  386. }
  387. else
  388. {
  389. int currentAmount = zStorage->containsKey(getRequirementId())
  390. ? (int)zStorage->zValue(getRequirementId())
  391. ->asNumber()
  392. ->getNumber()
  393. : 0;
  394. status = "Not completed (";
  395. status.append() << currentAmount << "/" << amount << ")";
  396. color = 0xFFFF0000;
  397. }
  398. zParent->addChild(builder
  399. ->addChild(UIMLBuilder::createTextAuto(description)
  400. ->setID(Framework::Text("requirement_description_")
  401. += getRequirementId())
  402. ->setAlignLeftToElement(
  403. itemTypeId > 0
  404. ? Framework::Text("requirement_itemStack_")
  405. += getRequirementId()
  406. : Framework::Text("start"))
  407. ->setMarginLeft(10)
  408. ->build())
  409. ->addChild(UIMLBuilder::createTextAuto(status)
  410. ->setAlignXToElement(
  411. Framework::Text("requirement_description_")
  412. += getRequirementId())
  413. ->setAlignTopToElement(
  414. Framework::Text("requirement_description_")
  415. += getRequirementId())
  416. ->setMarginTop(10)
  417. ->setAlignXToElement(
  418. Framework::Text("requirement_description_")
  419. += getRequirementId())
  420. ->setTextColor(color)
  421. ->build())
  422. ->build());
  423. }
  424. void QuestRequirementBlockPlace::setBlockTypeId(int blockTypeId)
  425. {
  426. this->blockTypeId = blockTypeId;
  427. }
  428. int QuestRequirementBlockPlace::getBlockTypeId() const
  429. {
  430. return blockTypeId;
  431. }
  432. void QuestRequirementBlockPlace::setAmount(int amount)
  433. {
  434. this->amount = amount;
  435. }
  436. int QuestRequirementBlockPlace::getAmount() const
  437. {
  438. return amount;
  439. }
  440. QuestRequirementBlockPlaceType::QuestRequirementBlockPlaceType()
  441. : QuestRequirementFactoryBase()
  442. {}
  443. QuestRequirementBlockPlace* QuestRequirementBlockPlaceType::createValue(
  444. Framework::JSON::JSONObject* zJson) const
  445. {
  446. return new QuestRequirementBlockPlace();
  447. }
  448. QuestRequirementBlockPlace* QuestRequirementBlockPlaceType::fromJson(
  449. Framework::JSON::JSONObject* zJson) const
  450. {
  451. QuestRequirementBlockPlace* result
  452. = QuestRequirementFactoryBase::fromJson(zJson);
  453. result->setBlockTypeId(Game::INSTANCE->getBlockTypeId(
  454. zJson->zValue("blockType")->asString()->getString()));
  455. result->setAmount((int)zJson->zValue("amount")->asNumber()->getNumber());
  456. return result;
  457. }
  458. Framework::JSON::JSONObject* QuestRequirementBlockPlaceType::toJsonObject(
  459. QuestRequirementBlockPlace* zObject) const
  460. {
  461. Framework::JSON::JSONObject* result
  462. = QuestRequirementFactoryBase::toJsonObject(zObject);
  463. result->addValue("blockType",
  464. new Framework::JSON::JSONString(
  465. Game::INSTANCE->zBlockType(zObject->getBlockTypeId())->getName()));
  466. result->addValue("amount",
  467. new Framework::JSON::JSONNumber((double)zObject->getAmount()));
  468. return result;
  469. }
  470. JSONObjectValidationBuilder* QuestRequirementBlockPlaceType::addToValidator(
  471. JSONObjectValidationBuilder* builder) const
  472. {
  473. return QuestRequirementFactoryBase::addToValidator(builder
  474. ->withRequiredAttribute("blockType",
  475. Game::INSTANCE->zTypeRegistry()->getValidator<Framework::Text>(
  476. BlockTypeNameFactory::TYPE_ID))
  477. ->withRequiredNumber("amount")
  478. ->whichIsGreaterOrEqual(1.0)
  479. ->withDefault(1.0)
  480. ->finishNumber());
  481. }
  482. const char* QuestRequirementBlockPlaceType::getTypeToken() const
  483. {
  484. return "block_place";
  485. }
  486. QuestRequirementBlockInteract::QuestRequirementBlockInteract()
  487. : QuestRequirement(),
  488. blockTypeId(0),
  489. itemTypeId(-1)
  490. {}
  491. void QuestRequirementBlockInteract::processEvent(
  492. QuestEvent* zEvent, QuestStorage* zStorage)
  493. {
  494. QuestEventBlockInteract* event
  495. = dynamic_cast<QuestEventBlockInteract*>(zEvent);
  496. if (event)
  497. {
  498. if (event->getBlockTypeId() == blockTypeId)
  499. {
  500. if (itemTypeId != -1 && event->getUsedItemTypeId() != itemTypeId)
  501. {
  502. return;
  503. }
  504. QuestRequirementStorage* zRequirementStorage
  505. = zStorage->zStorage(getRequirementId());
  506. zRequirementStorage->setFullfilled(true);
  507. }
  508. }
  509. }
  510. void QuestRequirementBlockInteract::addRequirementUIML(
  511. QuestStorage* zStorage, UIMLContainerBuilder* zParent)
  512. {
  513. UIMLContainerBuilder* builder
  514. = UIMLBuilder::createContainer()
  515. ->setWidthPercentage(100)
  516. ->setHeight(50)
  517. ->setDisplayAsRow(0, 10)
  518. ->setStyle(Framework::Window::Style::Visible
  519. | Framework::Window::Style::Allowed)
  520. ->setID(Framework::Text("requirement_") += getRequirementId());
  521. int itemTypeId = Game::INSTANCE->zBlockType(blockTypeId)->getItemTypeId();
  522. if (itemTypeId > 0)
  523. {
  524. builder->addChild(UIMLBuilder::createItemStack()
  525. ->setItemTypeID(itemTypeId)
  526. ->setAmount(1)
  527. ->setID(Framework::Text("requirement_itemStack_")
  528. += getRequirementId())
  529. ->setWidth(50)
  530. ->setHeight(50)
  531. ->setToolTip(
  532. Game::INSTANCE->zItemType(itemTypeId)->getTooltipUIML())
  533. ->build());
  534. }
  535. Framework::Text status;
  536. int color;
  537. if (zStorage->zStorage(getRequirementId())->isFullfilled())
  538. {
  539. status = "Completed";
  540. color = 0xFF00FF00;
  541. }
  542. else
  543. {
  544. status = "Not completed";
  545. color = 0xFFFF0000;
  546. }
  547. zParent->addChild(builder
  548. ->addChild(UIMLBuilder::createTextAuto(description)
  549. ->setID(Framework::Text("requirement_description_")
  550. += getRequirementId())
  551. ->setAlignLeftToElement(
  552. itemTypeId > 0
  553. ? Framework::Text("requirement_itemStack_")
  554. += getRequirementId()
  555. : Framework::Text("start"))
  556. ->setMarginLeft(10)
  557. ->build())
  558. ->addChild(UIMLBuilder::createTextAuto(status)
  559. ->setAlignXToElement(
  560. Framework::Text("requirement_description_")
  561. += getRequirementId())
  562. ->setAlignTopToElement(
  563. Framework::Text("requirement_description_")
  564. += getRequirementId())
  565. ->setMarginTop(10)
  566. ->setAlignXToElement(
  567. Framework::Text("requirement_description_")
  568. += getRequirementId())
  569. ->setTextColor(color)
  570. ->build())
  571. ->build());
  572. }
  573. void QuestRequirementBlockInteract::setBlockTypeId(int blockTypeId)
  574. {
  575. this->blockTypeId = blockTypeId;
  576. }
  577. int QuestRequirementBlockInteract::getBlockTypeId() const
  578. {
  579. return blockTypeId;
  580. }
  581. void QuestRequirementBlockInteract::setItemTypeId(int itemTypeId)
  582. {
  583. this->itemTypeId = itemTypeId;
  584. }
  585. int QuestRequirementBlockInteract::getItemTypeId() const
  586. {
  587. return itemTypeId;
  588. }
  589. QuestRequirementBlockInteractType::QuestRequirementBlockInteractType()
  590. : QuestRequirementFactoryBase()
  591. {}
  592. QuestRequirementBlockInteract* QuestRequirementBlockInteractType::createValue(
  593. Framework::JSON::JSONObject* zJson) const
  594. {
  595. return new QuestRequirementBlockInteract();
  596. }
  597. QuestRequirementBlockInteract* QuestRequirementBlockInteractType::fromJson(
  598. Framework::JSON::JSONObject* zJson) const
  599. {
  600. QuestRequirementBlockInteract* result
  601. = QuestRequirementFactoryBase::fromJson(zJson);
  602. result->setBlockTypeId(Game::INSTANCE->getBlockTypeId(
  603. zJson->zValue("blockType")->asString()->getString()));
  604. if (zJson->hasValue("itemType"))
  605. {
  606. result->setItemTypeId(Game::INSTANCE->getItemTypeId(
  607. zJson->zValue("itemType")->asString()->getString()));
  608. }
  609. else
  610. {
  611. result->setItemTypeId(-1);
  612. }
  613. return result;
  614. }
  615. Framework::JSON::JSONObject* QuestRequirementBlockInteractType::toJsonObject(
  616. QuestRequirementBlockInteract* zObject) const
  617. {
  618. Framework::JSON::JSONObject* result
  619. = QuestRequirementFactoryBase::toJsonObject(zObject);
  620. result->addValue("blockType",
  621. new Framework::JSON::JSONString(
  622. Game::INSTANCE->zBlockType(zObject->getBlockTypeId())->getName()));
  623. if (zObject->getItemTypeId() != -1)
  624. {
  625. result->addValue("itemType",
  626. new Framework::JSON::JSONString(
  627. Game::INSTANCE->zItemType(zObject->getItemTypeId())
  628. ->getName()));
  629. }
  630. return result;
  631. }
  632. JSONObjectValidationBuilder* QuestRequirementBlockInteractType::addToValidator(
  633. JSONObjectValidationBuilder* builder) const
  634. {
  635. return QuestRequirementFactoryBase::addToValidator(builder
  636. ->withRequiredAttribute("blockType",
  637. Game::INSTANCE->zTypeRegistry()->getValidator<Framework::Text>(
  638. BlockTypeNameFactory::TYPE_ID))
  639. ->withOptionalAttribute("itemType",
  640. Game::INSTANCE->zTypeRegistry()->getValidator<Framework::Text>(
  641. ItemTypeNameFactory::TYPE_ID)));
  642. }
  643. const char* QuestRequirementBlockInteractType::getTypeToken() const
  644. {
  645. return "block_interact";
  646. }
  647. QuestRequirementItemInInventory::QuestRequirementItemInInventory()
  648. : QuestRequirement(),
  649. itemTypeId(0),
  650. amount(1)
  651. {}
  652. void QuestRequirementItemInInventory::processEvent(
  653. QuestEvent* zEvent, QuestStorage* zStorage)
  654. {
  655. QuestEventItemPickup* event = dynamic_cast<QuestEventItemPickup*>(zEvent);
  656. if (event)
  657. {
  658. if (event->getItemTypeId() == itemTypeId)
  659. {
  660. TypeItemFilter filter;
  661. filter.setType(Game::INSTANCE->zItemType(itemTypeId));
  662. int current = event->zActingEntity()->countAccessableItems(
  663. &filter, Direction::NO_DIRECTION);
  664. int currentAmount = zStorage->containsKey(getRequirementId())
  665. ? (int)zStorage->zValue(getRequirementId())
  666. ->asNumber()
  667. ->getNumber()
  668. : 0;
  669. if (currentAmount < current)
  670. {
  671. currentAmount = current;
  672. }
  673. zStorage->putValue(getRequirementId(),
  674. new Framework::JSON::JSONNumber(currentAmount));
  675. if (currentAmount >= amount)
  676. {
  677. zStorage->zStorage(getRequirementId())->setFullfilled(true);
  678. }
  679. }
  680. }
  681. }
  682. void QuestRequirementItemInInventory::addRequirementUIML(
  683. QuestStorage* zStorage, UIMLContainerBuilder* zParent)
  684. {
  685. UIMLContainerBuilder* builder
  686. = UIMLBuilder::createContainer()
  687. ->setWidthPercentage(100)
  688. ->setHeight(50)
  689. ->setDisplayAsRow(0, 10)
  690. ->setStyle(Framework::Window::Style::Visible
  691. | Framework::Window::Style::Allowed)
  692. ->setID(Framework::Text("requirement_") += getRequirementId());
  693. builder->addChild(UIMLBuilder::createItemStack()
  694. ->setItemTypeID(itemTypeId)
  695. ->setAmount(amount)
  696. ->setID(
  697. Framework::Text("requirement_itemStack_") += getRequirementId())
  698. ->setWidth(50)
  699. ->setHeight(50)
  700. ->setToolTip(
  701. Game::INSTANCE->zItemType(itemTypeId)->getTooltipUIML())
  702. ->build());
  703. Framework::Text status;
  704. int color;
  705. if (zStorage->zStorage(getRequirementId())->isFullfilled())
  706. {
  707. status = "Completed (";
  708. status.append() << amount << "/" << amount << ")";
  709. color = 0xFF00FF00;
  710. }
  711. else
  712. {
  713. int currentAmount = zStorage->containsKey(getRequirementId())
  714. ? (int)zStorage->zValue(getRequirementId())
  715. ->asNumber()
  716. ->getNumber()
  717. : 0;
  718. status = "Not completed (";
  719. status.append() << currentAmount << "/" << amount << ")";
  720. color = 0xFFFF0000;
  721. }
  722. zParent->addChild(builder
  723. ->addChild(UIMLBuilder::createTextAuto(description)
  724. ->setID(Framework::Text("requirement_description_")
  725. += getRequirementId())
  726. ->setAlignLeftToElement(
  727. Framework::Text("requirement_itemStack_")
  728. += getRequirementId())
  729. ->setMarginLeft(10)
  730. ->setAlignTopStart()
  731. ->build())
  732. ->addChild(UIMLBuilder::createTextAuto(status)
  733. ->setAlignXToElement(
  734. Framework::Text("requirement_description_")
  735. += getRequirementId())
  736. ->setAlignTopToElement(
  737. Framework::Text("requirement_description_")
  738. += getRequirementId())
  739. ->setMarginTop(10)
  740. ->setAlignXToElement(
  741. Framework::Text("requirement_description_")
  742. += getRequirementId())
  743. ->setTextColor(color)
  744. ->build())
  745. ->build());
  746. }
  747. void QuestRequirementItemInInventory::setItemTypeId(int itemTypeId)
  748. {
  749. this->itemTypeId = itemTypeId;
  750. }
  751. int QuestRequirementItemInInventory::getItemTypeId() const
  752. {
  753. return itemTypeId;
  754. }
  755. void QuestRequirementItemInInventory::setAmount(int amount)
  756. {
  757. this->amount = amount;
  758. }
  759. int QuestRequirementItemInInventory::getAmount() const
  760. {
  761. return amount;
  762. }
  763. QuestRequirementItemInInventoryType::QuestRequirementItemInInventoryType()
  764. : QuestRequirementFactoryBase()
  765. {}
  766. QuestRequirementItemInInventory*
  767. QuestRequirementItemInInventoryType::createValue(
  768. Framework::JSON::JSONObject* zJson) const
  769. {
  770. return new QuestRequirementItemInInventory();
  771. }
  772. QuestRequirementItemInInventory* QuestRequirementItemInInventoryType::fromJson(
  773. Framework::JSON::JSONObject* zJson) const
  774. {
  775. QuestRequirementItemInInventory* result
  776. = QuestRequirementFactoryBase::fromJson(zJson);
  777. result->setItemTypeId(Game::INSTANCE->getItemTypeId(
  778. zJson->zValue("itemType")->asString()->getString()));
  779. result->setAmount((int)zJson->zValue("amount")->asNumber()->getNumber());
  780. return result;
  781. }
  782. Framework::JSON::JSONObject* QuestRequirementItemInInventoryType::toJsonObject(
  783. QuestRequirementItemInInventory* zObject) const
  784. {
  785. Framework::JSON::JSONObject* result
  786. = QuestRequirementFactoryBase::toJsonObject(zObject);
  787. result->addValue("itemType",
  788. new Framework::JSON::JSONString(
  789. Game::INSTANCE->zItemType(zObject->getItemTypeId())->getName()));
  790. result->addValue("amount",
  791. new Framework::JSON::JSONNumber((double)zObject->getAmount()));
  792. return result;
  793. }
  794. JSONObjectValidationBuilder*
  795. QuestRequirementItemInInventoryType::addToValidator(
  796. JSONObjectValidationBuilder* builder) const
  797. {
  798. return QuestRequirementFactoryBase::addToValidator(builder
  799. ->withRequiredAttribute("itemType",
  800. Game::INSTANCE->zTypeRegistry()->getValidator<Framework::Text>(
  801. ItemTypeNameFactory::TYPE_ID))
  802. ->withRequiredNumber("amount")
  803. ->whichIsGreaterOrEqual(1.0)
  804. ->withDefault(1.0)
  805. ->finishNumber());
  806. }
  807. const char* QuestRequirementItemInInventoryType::getTypeToken() const
  808. {
  809. return "item_in_inventory";
  810. }