Quest.cpp 26 KB

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