Quest.cpp 25 KB

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