Quest.cpp 26 KB

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