Quest.cpp 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905
  1. #include "Quest.h"
  2. #include <Datei.h>
  3. #include <Logging.h>
  4. #include "Game.h"
  5. #include "ItemType.h"
  6. QuestRequirementStorage::QuestRequirementStorage()
  7. : ReferenceCounter(),
  8. fulfilled(0)
  9. {}
  10. void QuestRequirementStorage::setFullfilled(bool fullfilled)
  11. {
  12. this->fulfilled = fullfilled;
  13. }
  14. bool QuestRequirementStorage::isFullfilled() const
  15. {
  16. return fulfilled;
  17. }
  18. void QuestRequirementStorage::setRequirementId(Framework::Text requirementId)
  19. {
  20. this->requirementId = requirementId;
  21. }
  22. const Framework::Text& QuestRequirementStorage::getRequirementId() const
  23. {
  24. return requirementId;
  25. }
  26. QuestRequirementStorageType::QuestRequirementStorageType()
  27. : ObjectTypeFactory<QuestRequirementStorage>()
  28. {}
  29. QuestRequirementStorage* QuestRequirementStorageType::fromJson(
  30. Framework::JSON::JSONObject* zJson) const
  31. {
  32. QuestRequirementStorage* result = new QuestRequirementStorage();
  33. result->setRequirementId(
  34. zJson->asObject()->zValue("requirementId")->asString()->getString());
  35. result->setFullfilled(
  36. zJson->asObject()->zValue("fulfilled")->asBool()->getBool());
  37. return result;
  38. }
  39. Framework::JSON::JSONObject* QuestRequirementStorageType::toJsonObject(
  40. QuestRequirementStorage* zObject) const
  41. {
  42. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  43. result->addValue("requirementId",
  44. new Framework::JSON::JSONString(zObject->getRequirementId()));
  45. result->addValue(
  46. "fulfilled", new Framework::JSON::JSONBool(zObject->isFullfilled()));
  47. return result;
  48. }
  49. JSONObjectValidationBuilder* QuestRequirementStorageType::addToValidator(
  50. JSONObjectValidationBuilder* builder) const
  51. {
  52. return builder->withRequiredString("requirementId")
  53. ->finishString()
  54. ->withRequiredBool("fulfilled")
  55. ->withDefault(false)
  56. ->finishBool();
  57. }
  58. QuestStorage::QuestStorage()
  59. : finished(0),
  60. rewarded(0),
  61. data(new Framework::JSON::JSONObject())
  62. {}
  63. QuestStorage::~QuestStorage()
  64. {
  65. data->release();
  66. }
  67. void QuestStorage::setQuestFinished(bool finished)
  68. {
  69. this->finished = finished;
  70. }
  71. void QuestStorage::setQuestRewarded(bool rewarded)
  72. {
  73. this->rewarded = rewarded;
  74. }
  75. bool QuestStorage::isQuestFinished() const
  76. {
  77. return finished;
  78. }
  79. bool QuestStorage::isQuestRewarded() const
  80. {
  81. return rewarded;
  82. }
  83. QuestRequirementStorage* QuestStorage::zStorage(Framework::Text requirementId)
  84. {
  85. for (QuestRequirementStorage* storage : requirements)
  86. {
  87. if (storage->getRequirementId().istGleich(requirementId))
  88. {
  89. return storage;
  90. }
  91. }
  92. QuestRequirementStorage* result = new QuestRequirementStorage();
  93. result->setRequirementId(requirementId);
  94. requirements.add(result);
  95. return result;
  96. }
  97. void QuestStorage::setQuestId(Framework::Text questId)
  98. {
  99. this->questId = questId;
  100. }
  101. const Framework::Text& QuestStorage::getQuestId() const
  102. {
  103. return questId;
  104. }
  105. bool QuestStorage::isVisible() const
  106. {
  107. return visible;
  108. }
  109. void QuestStorage::setVisible(bool visible)
  110. {
  111. this->visible = visible;
  112. }
  113. void QuestStorage::putValue(
  114. Framework::Text key, Framework::JSON::JSONValue* value)
  115. {
  116. data->removeValue(key);
  117. data->addValue(key, value);
  118. }
  119. Framework::JSON::JSONValue* QuestStorage::getValue(Framework::Text key) const
  120. {
  121. return data->getValue(key);
  122. }
  123. Framework::JSON::JSONValue* QuestStorage::zValue(Framework::Text key) const
  124. {
  125. return data->zValue(key);
  126. }
  127. bool QuestStorage::containsKey(Framework::Text key) const
  128. {
  129. return data->hasValue(key);
  130. }
  131. QuestStorageType::QuestStorageType()
  132. : ObjectTypeFactory<QuestStorage>()
  133. {}
  134. QuestStorage* QuestStorageType::fromJson(
  135. Framework::JSON::JSONObject* zJson) const
  136. {
  137. QuestStorage* result = new QuestStorage();
  138. result->setQuestId(
  139. zJson->asObject()->zValue("questId")->asString()->getString());
  140. result->setQuestFinished(
  141. zJson->asObject()->zValue("finished")->asBool()->getBool());
  142. result->setQuestRewarded(
  143. zJson->asObject()->zValue("rewarded")->asBool()->getBool());
  144. Framework::JSON::JSONArray* rewardsArray
  145. = zJson->asObject()->zValue("requirements")->asArray();
  146. for (int i = 0; i < rewardsArray->getLength(); i++)
  147. {
  148. result->requirements.add(
  149. Game::INSTANCE->zTypeRegistry()->fromJson<QuestRequirementStorage>(
  150. rewardsArray->zValue(i)->asObject()));
  151. }
  152. result->data->release();
  153. result->data = zJson->asObject()->getValue("data")->asObject();
  154. return result;
  155. }
  156. Framework::JSON::JSONObject* QuestStorageType::toJsonObject(
  157. QuestStorage* zObject) const
  158. {
  159. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  160. result->addValue(
  161. "questId", new Framework::JSON::JSONString(zObject->questId));
  162. result->addValue(
  163. "finished", new Framework::JSON::JSONBool(zObject->finished));
  164. result->addValue(
  165. "rewarded", new Framework::JSON::JSONBool(zObject->rewarded));
  166. Framework::JSON::JSONArray* rewardsArray = new Framework::JSON::JSONArray();
  167. for (QuestRequirementStorage* storage : zObject->requirements)
  168. {
  169. rewardsArray->addValue(
  170. Game::INSTANCE->zTypeRegistry()->toJson(storage));
  171. }
  172. result->addValue("requirements", rewardsArray);
  173. Framework::Text dataString = zObject->data->toString();
  174. result->addValue("data", Framework::JSON::Parser::getValue(dataString));
  175. return result;
  176. }
  177. JSONObjectValidationBuilder* QuestStorageType::addToValidator(
  178. JSONObjectValidationBuilder* builder) const
  179. {
  180. return builder->withRequiredString("questId")
  181. ->finishString()
  182. ->withRequiredBool("finished")
  183. ->withDefault(false)
  184. ->finishBool()
  185. ->withRequiredBool("rewarded")
  186. ->withDefault(false)
  187. ->finishBool()
  188. ->withRequiredArray("requirements")
  189. ->addAcceptedTypeInArray(Game::INSTANCE->zTypeRegistry()
  190. ->getValidator<QuestRequirementStorage>())
  191. ->finishArray()
  192. ->withRequiredObject("data")
  193. ->allowAdditionalAttriutes()
  194. ->finishObject();
  195. }
  196. QuestParty::QuestParty()
  197. : ReferenceCounter()
  198. {}
  199. void QuestParty::addMember(int memberEntityId)
  200. {
  201. memberEntityIds.add(memberEntityId);
  202. }
  203. void QuestParty::removeMember(int memberEntityId)
  204. {
  205. memberEntityIds.removeValue(memberEntityId);
  206. }
  207. bool QuestParty::isMember(int memberEntityId) const
  208. {
  209. return memberEntityIds.hat(memberEntityId);
  210. }
  211. bool QuestParty::isEmpty() const
  212. {
  213. return memberEntityIds.getEintragAnzahl() == 0;
  214. }
  215. QuestStorage* QuestParty::zQuestStorage(Framework::Text questId)
  216. {
  217. for (QuestStorage* storage : questStorage)
  218. {
  219. if (storage->getQuestId().istGleich(questId))
  220. {
  221. return storage;
  222. }
  223. }
  224. QuestStorage* result = new QuestStorage();
  225. result->setQuestId(questId);
  226. questStorage.add(result);
  227. return result;
  228. }
  229. QuestParty* QuestParty::clone() const
  230. {
  231. QuestParty* result = new QuestParty();
  232. for (QuestStorage* storage : questStorage)
  233. {
  234. Framework::JSON::JSONValue* value
  235. = Game::INSTANCE->zTypeRegistry()->toJson(storage);
  236. result->questStorage.add(
  237. Game::INSTANCE->zTypeRegistry()->fromJson<QuestStorage>(value));
  238. value->release();
  239. }
  240. return result;
  241. }
  242. QuestPartyType::QuestPartyType()
  243. : ObjectTypeFactory<QuestParty>()
  244. {}
  245. QuestParty* QuestPartyType::fromJson(Framework::JSON::JSONObject* zJson) const
  246. {
  247. QuestParty* result = new QuestParty();
  248. Framework::JSON::JSONArray* membersArray
  249. = zJson->asObject()->zValue("members")->asArray();
  250. for (int i = 0; i < membersArray->getLength(); i++)
  251. {
  252. result->memberEntityIds.add(
  253. (int)membersArray->zValue(i)->asNumber()->getNumber());
  254. }
  255. Framework::JSON::JSONArray* storagesArray
  256. = zJson->asObject()->zValue("quests")->asArray();
  257. for (int i = 0; i < storagesArray->getLength(); i++)
  258. {
  259. result->questStorage.add(
  260. Game::INSTANCE->zTypeRegistry()->fromJson<QuestStorage>(
  261. storagesArray->zValue(i)->asObject()));
  262. }
  263. return result;
  264. }
  265. Framework::JSON::JSONObject* QuestPartyType::toJsonObject(
  266. QuestParty* zObject) const
  267. {
  268. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  269. Framework::JSON::JSONArray* membersArray = new Framework::JSON::JSONArray();
  270. for (int memberEntityId : zObject->memberEntityIds)
  271. {
  272. membersArray->addValue(new Framework::JSON::JSONNumber(memberEntityId));
  273. }
  274. result->addValue("members", membersArray);
  275. Framework::JSON::JSONArray* storagesArray
  276. = new Framework::JSON::JSONArray();
  277. for (QuestStorage* storage : zObject->questStorage)
  278. {
  279. storagesArray->addValue(
  280. Game::INSTANCE->zTypeRegistry()->toJson(storage));
  281. }
  282. result->addValue("quests", storagesArray);
  283. return result;
  284. }
  285. JSONObjectValidationBuilder* QuestPartyType::addToValidator(
  286. JSONObjectValidationBuilder* builder) const
  287. {
  288. return builder->withRequiredArray("members")
  289. ->addAcceptedNumberInArray()
  290. ->finishNumber()
  291. ->removeInvalidEntries()
  292. ->finishArray()
  293. ->withRequiredArray("quests")
  294. ->addAcceptedTypeInArray(
  295. Game::INSTANCE->zTypeRegistry()->getValidator<QuestStorage>())
  296. ->removeInvalidEntries()
  297. ->finishArray();
  298. }
  299. Quest::Quest()
  300. : ReferenceCounter(),
  301. mainQuest(0)
  302. {}
  303. void Quest::processEvent(QuestEvent* zEvent, QuestStorage* zStorage)
  304. {
  305. bool finished = 1;
  306. for (QuestRequirement* requirement : requirements)
  307. {
  308. QuestRequirementStorage* zRequirementStorage
  309. = zStorage->zStorage(requirement->getRequirementId());
  310. if (!zRequirementStorage->isFullfilled())
  311. {
  312. requirement->processEvent(zEvent, zStorage);
  313. finished &= zRequirementStorage->isFullfilled();
  314. }
  315. }
  316. if (finished)
  317. {
  318. zStorage->setQuestFinished(1);
  319. }
  320. }
  321. bool Quest::isVisible(QuestParty* zParty, QuestManager* zManager)
  322. {
  323. if (zParty->zQuestStorage(questId)->isVisible())
  324. {
  325. return 1;
  326. }
  327. bool visible = requiredQuestsIds.getEintragAnzahl() == 0;
  328. for (Framework::Text* requiredQuestId : requiredQuestsIds)
  329. {
  330. visible |= zParty->zQuestStorage(*requiredQuestId)->isQuestFinished();
  331. }
  332. if (visible)
  333. {
  334. zParty->zQuestStorage(questId)->setVisible(visible);
  335. }
  336. for (Framework::Text* requiredQuestId : requiredQuestsIds)
  337. {
  338. zManager->setQuestVisible(true, *requiredQuestId, zParty);
  339. }
  340. return visible;
  341. }
  342. bool Quest::isActive(QuestParty* zParty)
  343. {
  344. bool active = 0;
  345. auto requiredQuestsIdsI = requiredQuestsGroups.begin();
  346. int last = 0;
  347. bool tmp = 1;
  348. bool first = 1;
  349. for (Framework::Text* requiredQuestId : requiredQuestsIds)
  350. {
  351. tmp &= zParty->zQuestStorage(*requiredQuestId)->isQuestFinished();
  352. first = 0;
  353. if (last != *requiredQuestsIdsI)
  354. {
  355. active |= tmp;
  356. tmp = 1;
  357. first = 1;
  358. if (active)
  359. {
  360. break;
  361. }
  362. }
  363. last = requiredQuestsIdsI.val();
  364. requiredQuestsIdsI++;
  365. }
  366. if (!first || requiredQuestsIds.getEintragAnzahl() == 0)
  367. {
  368. active |= tmp;
  369. }
  370. return active;
  371. }
  372. void Quest::setQuestId(Framework::Text questId)
  373. {
  374. this->questId = questId;
  375. }
  376. const Framework::Text& Quest::getQuestId() const
  377. {
  378. return questId;
  379. }
  380. void Quest::setVisible(bool visible, QuestParty* zParty, QuestManager* zManager)
  381. {
  382. if (zParty->zQuestStorage(questId)->isVisible() == visible)
  383. {
  384. return;
  385. }
  386. zParty->zQuestStorage(questId)->setVisible(visible);
  387. if (visible)
  388. {
  389. for (Framework::Text* requiredQuestId : requiredQuestsIds)
  390. {
  391. zManager->setQuestVisible(visible, *requiredQuestId, zParty);
  392. }
  393. }
  394. }
  395. QuestType::QuestType()
  396. : ObjectTypeFactory<Quest>()
  397. {}
  398. Quest* QuestType::fromJson(Framework::JSON::JSONObject* zJson) const
  399. {
  400. Quest* result = new Quest();
  401. result->setQuestId(
  402. zJson->asObject()->zValue("questId")->asString()->getString());
  403. result->questName
  404. = zJson->asObject()->zValue("questName")->asString()->getString();
  405. result->description
  406. = zJson->asObject()->zValue("description")->asString()->getString();
  407. Framework::JSON::JSONArray* requiredQuestGroups
  408. = zJson->asObject()->zValue("requiredQuestIds")->asArray();
  409. for (int i = 0; i < requiredQuestGroups->getLength(); i++)
  410. {
  411. Framework::JSON::JSONArray* requiredQuestIdsArray
  412. = requiredQuestGroups->zValue(i)->asArray();
  413. for (int j = 0; j < requiredQuestIdsArray->getLength(); j++)
  414. {
  415. result->requiredQuestsIds.add(new Framework::Text(
  416. requiredQuestIdsArray->zValue(j)->asString()->getString()));
  417. result->requiredQuestsGroups.add(i);
  418. }
  419. }
  420. Framework::JSON::JSONArray* requirementsArray
  421. = zJson->asObject()->zValue("requirements")->asArray();
  422. for (int i = 0; i < requirementsArray->getLength(); i++)
  423. {
  424. result->requirements.add(
  425. Game::INSTANCE->zTypeRegistry()->fromJson<QuestRequirement>(
  426. requirementsArray->zValue(i)));
  427. }
  428. Framework::JSON::JSONArray* rewardsArray
  429. = zJson->asObject()->zValue("rewards")->asArray();
  430. for (int i = 0; i < rewardsArray->getLength(); i++)
  431. {
  432. result->rewards.add(
  433. Game::INSTANCE->zTypeRegistry()->fromJson<QuestReward>(
  434. rewardsArray->zValue(i)));
  435. }
  436. if (zJson->asObject()->hasValue("imagePath"))
  437. {
  438. result->imagePath
  439. = zJson->asObject()->zValue("imagePath")->asString()->getString();
  440. }
  441. else if (zJson->asObject()->hasValue("imageItemType"))
  442. {
  443. result->imagePath = Framework::Text("itemType:")
  444. + zJson->asObject()
  445. ->zValue("imageItemType")
  446. ->asString()
  447. ->getString();
  448. }
  449. else
  450. {
  451. result->imagePath
  452. = Framework::Text("itemType:")
  453. + Game::INSTANCE->zItemType(ItemTypeEnum::PLAYER_HAND)->getName();
  454. }
  455. result->mainQuest
  456. = zJson->asObject()->zValue("mainQuest")->asBool()->getBool();
  457. return result;
  458. }
  459. Framework::JSON::JSONObject* QuestType::toJsonObject(Quest* zObject) const
  460. {
  461. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  462. result->addValue(
  463. "questId", new Framework::JSON::JSONString(zObject->questId));
  464. result->addValue(
  465. "questName", new Framework::JSON::JSONString(zObject->questName));
  466. result->addValue(
  467. "description", new Framework::JSON::JSONString(zObject->description));
  468. Framework::JSON::JSONArray* requiredQuestGroupArray
  469. = new Framework::JSON::JSONArray();
  470. Framework::JSON::JSONArray* requiredQuestIdsArray
  471. = new Framework::JSON::JSONArray();
  472. int index = 0;
  473. int lastGroup = 0;
  474. for (Framework::Text* requiredQuestId : zObject->requiredQuestsIds)
  475. {
  476. int group = zObject->requiredQuestsGroups.get(index);
  477. if (lastGroup != group)
  478. {
  479. if (requiredQuestIdsArray->getLength())
  480. {
  481. requiredQuestGroupArray->addValue(requiredQuestIdsArray);
  482. requiredQuestIdsArray = new Framework::JSON::JSONArray();
  483. }
  484. lastGroup = group;
  485. }
  486. requiredQuestIdsArray->addValue(
  487. new Framework::JSON::JSONString(*requiredQuestId));
  488. index++;
  489. }
  490. if (requiredQuestIdsArray->getLength())
  491. {
  492. requiredQuestGroupArray->addValue(requiredQuestIdsArray);
  493. requiredQuestIdsArray = new Framework::JSON::JSONArray();
  494. }
  495. result->addValue("requiredQuestIds", requiredQuestGroupArray);
  496. Framework::JSON::JSONArray* requirementsArray
  497. = new Framework::JSON::JSONArray();
  498. for (QuestRequirement* requirement : zObject->requirements)
  499. {
  500. requirementsArray->addValue(
  501. Game::INSTANCE->zTypeRegistry()->toJson(requirement));
  502. }
  503. result->addValue("requirements", requirementsArray);
  504. Framework::JSON::JSONArray* rewardsArray = new Framework::JSON::JSONArray();
  505. for (QuestReward* reward : zObject->rewards)
  506. {
  507. rewardsArray->addValue(Game::INSTANCE->zTypeRegistry()->toJson(reward));
  508. }
  509. result->addValue("rewards", rewardsArray);
  510. if (zObject->imagePath.beginnsWith("itemType:"))
  511. {
  512. Framework::Text* itemTypeName = zObject->imagePath.getTeilText(9);
  513. result->addValue(
  514. "imageItemType", new Framework::JSON::JSONString(*itemTypeName));
  515. itemTypeName->release();
  516. }
  517. else
  518. {
  519. result->addValue(
  520. "imagePath", new Framework::JSON::JSONString(zObject->imagePath));
  521. }
  522. result->addValue(
  523. "mainQuest", new Framework::JSON::JSONBool(zObject->mainQuest));
  524. return result;
  525. }
  526. JSONObjectValidationBuilder* QuestType::addToValidator(
  527. JSONObjectValidationBuilder* builder) const
  528. {
  529. return builder->withRequiredString("questId")
  530. ->finishString()
  531. ->withRequiredString("questName")
  532. ->finishString()
  533. ->withRequiredString("description")
  534. ->finishString()
  535. ->withRequiredArray("requiredQuestIds")
  536. ->addAcceptedArrayInArray()
  537. ->addAcceptedStringInArray()
  538. ->finishString()
  539. ->finishArray()
  540. ->withDefault(new Framework::JSON::JSONArray())
  541. ->finishArray()
  542. ->withRequiredArray("requirements")
  543. ->addAcceptedTypeInArray(
  544. Game::INSTANCE->zTypeRegistry()->getValidator<QuestRequirement>())
  545. ->finishArray()
  546. ->withRequiredArray("rewards")
  547. ->addAcceptedTypeInArray(
  548. Game::INSTANCE->zTypeRegistry()->getValidator<QuestReward>())
  549. ->finishArray()
  550. ->withOptionalString("imagePath")
  551. ->finishString()
  552. ->withRequiredAttribute("imageItemType",
  553. Game::INSTANCE->zTypeRegistry()->getValidator<Framework::Text>(
  554. ItemTypeNameFactory::TYPE_ID),
  555. 0,
  556. 1)
  557. ->withRequiredBool("mainQuest")
  558. ->withDefault(false)
  559. ->finishBool();
  560. }
  561. QuestCollection::QuestCollection()
  562. : ReferenceCounter()
  563. {}
  564. void QuestCollection::processEvent(QuestEvent* zEvent, QuestParty* zParty)
  565. {
  566. for (Quest* quest : quests)
  567. {
  568. QuestStorage* zStorage = zParty->zQuestStorage(quest->getQuestId());
  569. if (quest->isActive(zParty) && !zStorage->isQuestFinished())
  570. {
  571. quest->processEvent(zEvent, zStorage);
  572. }
  573. }
  574. }
  575. bool QuestCollection::isVisible(QuestParty* zParty, QuestManager* zManager)
  576. {
  577. bool visible = 0;
  578. for (Quest* quest : quests)
  579. {
  580. visible |= quest->isVisible(zParty, zManager);
  581. }
  582. return visible;
  583. }
  584. void QuestCollection::addQuest(Quest* zQuest)
  585. {
  586. quests.add(zQuest);
  587. }
  588. void QuestCollection::setName(Framework::Text name)
  589. {
  590. this->name = name;
  591. }
  592. const Framework::Text& QuestCollection::getName() const
  593. {
  594. return name;
  595. }
  596. void QuestCollection::setQuestVisible(bool visible,
  597. Framework::Text questId,
  598. QuestParty* zParty,
  599. QuestManager* zManager)
  600. {
  601. for (Quest* quest : quests)
  602. {
  603. if (quest->getQuestId().istGleich(questId))
  604. {
  605. return quest->setVisible(visible, zParty, zManager);
  606. }
  607. }
  608. }
  609. QuestCollectionType::QuestCollectionType()
  610. : ObjectTypeFactory<QuestCollection>()
  611. {}
  612. QuestCollection* QuestCollectionType::fromJson(
  613. Framework::JSON::JSONObject* zJson) const
  614. {
  615. QuestCollection* result = new QuestCollection();
  616. result->setName(zJson->asObject()->zValue("name")->asString()->getString());
  617. Framework::JSON::JSONArray* questsArray
  618. = zJson->asObject()->zValue("quests")->asArray();
  619. for (int i = 0; i < questsArray->getLength(); i++)
  620. {
  621. result->quests.add(Game::INSTANCE->zTypeRegistry()->fromJson<Quest>(
  622. questsArray->zValue(i)->asObject()));
  623. }
  624. return result;
  625. }
  626. Framework::JSON::JSONObject* QuestCollectionType::toJsonObject(
  627. QuestCollection* zObject) const
  628. {
  629. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  630. result->addValue("name", new Framework::JSON::JSONString(zObject->name));
  631. Framework::JSON::JSONArray* questsArray = new Framework::JSON::JSONArray();
  632. for (Quest* quest : zObject->quests)
  633. {
  634. questsArray->addValue(Game::INSTANCE->zTypeRegistry()->toJson(quest));
  635. }
  636. result->addValue("quests", questsArray);
  637. return result;
  638. }
  639. JSONObjectValidationBuilder* QuestCollectionType::addToValidator(
  640. JSONObjectValidationBuilder* builder) const
  641. {
  642. return builder->withRequiredString("name")
  643. ->finishString()
  644. ->withRequiredArray("quests")
  645. ->addAcceptedTypeInArray(
  646. Game::INSTANCE->zTypeRegistry()->getValidator<Quest>())
  647. ->removeInvalidEntries()
  648. ->finishArray();
  649. }
  650. QuestManager::QuestManager()
  651. : ReferenceCounter()
  652. {}
  653. QuestParty* QuestManager::zParty(int entityId)
  654. {
  655. for (QuestParty* party : parties)
  656. {
  657. if (party->isMember(entityId))
  658. {
  659. return party;
  660. }
  661. }
  662. QuestParty* result = new QuestParty();
  663. result->addMember(entityId);
  664. parties.add(result);
  665. return result;
  666. }
  667. QuestCollection* QuestManager::zCollection(int index)
  668. {
  669. return questCollections.z(index);
  670. }
  671. void QuestManager::loadQuests()
  672. {
  673. Framework::Text worldDir = Game::INSTANCE->getWorldDirectory();
  674. Framework::Text questDir = worldDir + "/quests";
  675. if (!Framework::DateiExistiert(questDir))
  676. {
  677. Framework::Logging::info()
  678. << "no quest data found in world save, using default data";
  679. questDir = "data/quests";
  680. }
  681. Framework::JSON::JSONValue* value
  682. = Framework::JSON::loadJSONFromFile(questDir + "/quests.json");
  683. if (!value || value->getType() == Framework::AbstractType::NULL_)
  684. {
  685. Framework::Logging::warning()
  686. << "No valid quests.json found in " << questDir;
  687. if (value)
  688. {
  689. value->release();
  690. }
  691. }
  692. else
  693. {
  694. Framework::Logging::info() << "loading quests ...";
  695. Framework::Validator::DataValidator* validator
  696. = Framework::Validator::DataValidator::buildForArray()
  697. ->addAcceptedTypeInArray(Game::INSTANCE->zTypeRegistry()
  698. ->getValidator<QuestCollection>())
  699. ->removeInvalidEntries()
  700. ->finishArray();
  701. Framework::RCArray<Framework::Validator::ValidationResult>
  702. validationResult;
  703. Framework::JSON::JSONArray* valid
  704. = validator->getValidParts(value, &validationResult)->asArray();
  705. for (Framework::Validator::ValidationResult* invalidPart :
  706. validationResult)
  707. {
  708. Framework::Logging::error() << invalidPart->getInvalidInfo();
  709. }
  710. value->release();
  711. for (Framework::JSON::JSONValue* validPart : *valid)
  712. {
  713. questCollections.add(
  714. Game::INSTANCE->zTypeRegistry()->fromJson<QuestCollection>(
  715. validPart->asObject()));
  716. }
  717. valid->release();
  718. Framework::JSON::JSONObject* schema = validator->getJsonSchema();
  719. Framework::Datei syntaxFile;
  720. syntaxFile.setDatei("data/syntax/schema/quests.json");
  721. syntaxFile.erstellen();
  722. syntaxFile.open(Framework::Datei::Style::schreiben);
  723. syntaxFile.schreibe(schema->toString(), schema->toString().getLength());
  724. syntaxFile.close();
  725. schema->release();
  726. validator->release();
  727. }
  728. value = Framework::JSON::loadJSONFromFile(questDir + "/parties.json");
  729. if (!value || value->getType() == Framework::AbstractType::NULL_)
  730. {
  731. if (value)
  732. {
  733. value->release();
  734. }
  735. }
  736. else
  737. {
  738. Framework::Logging::info() << "loading quest parties ...";
  739. Framework::Validator::DataValidator* validator
  740. = Framework::Validator::DataValidator::buildForArray()
  741. ->addAcceptedTypeInArray(Game::INSTANCE->zTypeRegistry()
  742. ->getValidator<QuestParty>())
  743. ->removeInvalidEntries()
  744. ->finishArray();
  745. Framework::RCArray<Framework::Validator::ValidationResult>
  746. validationResult;
  747. Framework::JSON::JSONArray* valid
  748. = validator->getValidParts(value, &validationResult)->asArray();
  749. for (Framework::Validator::ValidationResult* invalidPart :
  750. validationResult)
  751. {
  752. Framework::Logging::error() << invalidPart->getInvalidInfo();
  753. }
  754. value->release();
  755. for (Framework::JSON::JSONValue* validPart : *valid)
  756. {
  757. parties.add(Game::INSTANCE->zTypeRegistry()->fromJson<QuestParty>(
  758. validPart->asObject()));
  759. }
  760. valid->release();
  761. validator->release();
  762. }
  763. Framework::Logging::info()
  764. << "Loaded " << questCollections.getEintragAnzahl()
  765. << " Quest Collections and " << parties.getEintragAnzahl()
  766. << " Quest Parties";
  767. }
  768. void QuestManager::saveQuests()
  769. {
  770. Framework::Text worldDir = Game::INSTANCE->getWorldDirectory();
  771. Framework::Text questDir = worldDir + "/quests";
  772. if (!Framework::DateiExistiert(questDir))
  773. {
  774. Framework::DateiPfadErstellen(questDir + "/");
  775. }
  776. Framework::JSON::JSONArray* questCollectionsArray
  777. = new Framework::JSON::JSONArray();
  778. for (QuestCollection* questCollection : questCollections)
  779. {
  780. questCollectionsArray->addValue(
  781. Game::INSTANCE->zTypeRegistry()->toJson(questCollection));
  782. }
  783. Framework::Datei datei(questDir + "/quests.json");
  784. if (!datei.existiert()) datei.erstellen();
  785. datei.open(Framework::Datei::Style::schreiben);
  786. Framework::Text jsonStr = questCollectionsArray->toString();
  787. datei.schreibe(jsonStr.getText(), jsonStr.getLength());
  788. datei.close();
  789. questCollectionsArray->release();
  790. Framework::JSON::JSONArray* partiesArray = new Framework::JSON::JSONArray();
  791. for (QuestParty* party : parties)
  792. {
  793. partiesArray->addValue(Game::INSTANCE->zTypeRegistry()->toJson(party));
  794. }
  795. datei.setDatei(questDir + "/parties.json");
  796. if (!datei.existiert()) datei.erstellen();
  797. datei.open(Framework::Datei::Style::schreiben);
  798. jsonStr = partiesArray->toString();
  799. datei.schreibe(jsonStr.getText(), jsonStr.getLength());
  800. datei.close();
  801. partiesArray->release();
  802. }
  803. void QuestManager::processEvent(QuestEvent* event)
  804. {
  805. if (!event->zActingEntity())
  806. {
  807. for (QuestParty* party : parties)
  808. {
  809. for (QuestCollection* questCollection : questCollections)
  810. {
  811. questCollection->processEvent(event, party);
  812. }
  813. }
  814. }
  815. else
  816. {
  817. QuestParty* party = zParty(event->zActingEntity()->getId());
  818. if (party)
  819. {
  820. for (QuestCollection* questCollection : questCollections)
  821. {
  822. questCollection->processEvent(event, party);
  823. }
  824. }
  825. }
  826. event->release();
  827. }
  828. void QuestManager::setQuestVisible(
  829. bool visible, Framework::Text questId, QuestParty* zParty)
  830. {
  831. for (QuestCollection* questCollection : questCollections)
  832. {
  833. questCollection->setQuestVisible(visible, questId, zParty, this);
  834. }
  835. }