| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488 |
- #include "QuestDialog.h"
- #include <Fenster.h>
- #include <TextFeld.h>
- #include "Game.h"
- #include "Quest.h"
- #include "UIMLBuilder.h"
- QuestDialog::QuestDialog(int playerId)
- : UIDialog("quests", playerId, 0)
- {
- QuestManager* zManager = Game::INSTANCE->zQuestManager();
- UIMLListSelectionBuilder* listBuilder
- = UIMLBuilder::createListSelection()
- ->setID("collectionList")
- ->setWidth(200)
- ->setHeightPercentage(100)
- ->setItemHeight(40)
- ->setAlignTopStart()
- ->setAlignLeftStart()
- ->setOnSelectNotification("quests", 0);
- QuestParty* party = zManager->zParty(playerId);
- int index = 0;
- for (QuestCollection* questCollection : zManager->questCollections)
- {
- if (questCollection->isVisible(party, zManager))
- {
- listBuilder->addItem(
- Framework::Text("quest_collection_") += index++,
- questCollection->getName(),
- false);
- }
- }
- this->uiml = UIMLBuilder::createDialog("quests")
- ->setTitle("Quests")
- ->setWidth(1200)
- ->setHeight(800)
- ->addElement(listBuilder->build())
- ->addElement(UIMLBuilder::createQuestGraph()
- ->setID("visible_quest_graph")
- ->setWidth(1000)
- ->setHeightPercentage(100)
- ->setAlignLeftToElement("collectionList")
- ->build())
- ->addElement(UIMLBuilder::createContainer()
- ->setID("questDetailView")
- ->setWidthPercentage(100)
- ->setHeightPercentage(0)
- ->setStyle(Framework::Fenster::Style::Titel
- | Framework::Fenster::Style::Erlaubt
- | Framework::Fenster::Style::Sichtbar)
- ->setTitleHeight(30)
- ->setTitleFontSize(20)
- ->build())
- ->build();
- }
- void QuestDialog::api(
- Framework::StreamReader* zRequest, NetworkMessage* zResponse)
- {
- char typ;
- zRequest->lese(&typ, 1);
- switch (typ)
- {
- case 0: // onSelect Message of listView
- { // open quest graph
- int selection;
- zRequest->lese((char*)&selection, 4);
- auto questGraph = this->uiml->selectChildsByName("questGraph");
- questGraph.selectChildren().remove();
- auto listItems
- = uiml->selectChildsByName("listView").selectChildren();
- listItems.removeAttribute("selected");
- QuestManager* zManager = Game::INSTANCE->zQuestManager();
- auto questCollection = zManager->zCollection(selection);
- QuestParty* zParty = zManager->zParty(getPlayerId());
- for (Quest* quest : questCollection->quests)
- {
- if (quest->isVisible(zParty, zManager))
- {
- questGraph.addChild(getQuestGraphItem(quest, zParty));
- }
- }
- listItems
- .whereAttributeEquals(
- "id", Framework::Text("quest_collection_") + selection)
- .forEach(
- [this, &questGraph](Framework::XML::Element* zElement) {
- zElement->setAttribute("selected", "");
- });
- update();
- break;
- }
- case 1: // onClick Message of questGraphItem
- { // open quest detail view
- unsigned char len;
- zRequest->lese((char*)&len, 1);
- char* id = new char[len + 1];
- zRequest->lese(id, len);
- id[len] = 0;
- Framework::Text selectedId
- = uiml->selectChildsByName("listView")
- .selectChildren()
- .whereAttributeExists("selected")
- .getFirstElement()
- .map<Framework::Text>(
- [](Framework::XML::Element* element) {
- return element->getAttributeValue("id");
- })
- .orElse("");
- QuestManager* zManager = Game::INSTANCE->zQuestManager();
- QuestCollection* questCollection
- = zManager->zCollection(Framework::TextZuInt(
- selectedId.getText() + strlen("quest_collection_"), 10));
- QuestParty* zParty = zManager->zParty(getPlayerId());
- for (Quest* quest : questCollection->quests)
- {
- if (quest->isActive(zParty)
- && quest->getQuestId().istGleich(id))
- {
- QuestStorage* zStorage
- = zParty->zQuestStorage(quest->questId);
- uiml->selectChildsByAttribute("id", "collectionList")
- .setAttribute("height", "0");
- uiml->selectChildsByAttribute("id", "visible_quest_graph")
- .setAttribute("height", "0");
- auto questView
- = uiml->selectChildsByAttribute("id", "questDetailView")
- .getFirstElement();
- questView->setAttribute("height", "100%");
- questView->setAttribute("questId", quest->questId);
- questView->removeAllChilds();
- showQuestDetails(quest,
- zStorage,
- (Framework::RCPointer<Framework::XML::Element>)
- questView);
- break;
- }
- }
- delete[] id;
- break;
- }
- case 2: // onClick Message of back_to_graph
- {
- auto detailView
- = uiml->selectChildsByAttribute("id", "questDetailView");
- detailView.removeAllChilds();
- detailView.setAttribute("height", "0");
- uiml->selectChildsByAttribute("id", "collectionList")
- .setAttribute("height", "100%");
- uiml->selectChildsByAttribute("id", "visible_quest_graph")
- .setAttribute("height", "100%");
- update();
- break;
- }
- case 3: // onClick Message of give_rewards
- {
- Framework::Text selectedId
- = uiml->selectChildsByName("listView")
- .selectChildren()
- .whereAttributeExists("selected")
- .getFirstElement()
- .map<Framework::Text>([](auto element) {
- return element->getAttributeValue("id");
- })
- .orElse("");
- QuestManager* zManager = Game::INSTANCE->zQuestManager();
- QuestCollection* questCollection
- = zManager->zCollection(Framework::TextZuInt(
- selectedId.getText() + strlen("quest_collection_"), 10));
- QuestParty* zParty = zManager->zParty(getPlayerId());
- Framework::Text questId
- = uiml->selectChildsByAttribute("id", "questDetailView")
- .getFirstElement()
- ->getAttributeValue("questId");
- for (Quest* quest : questCollection->quests)
- {
- if (quest->getQuestId().istGleich(questId))
- {
- QuestStorage* zStorage
- = zParty->zQuestStorage(quest->questId);
- if (zStorage->isQuestFinished()
- && !zStorage->isQuestRewarded())
- {
- Framework::XML::Element* rewardContainer
- = (Framework::RCPointer<Framework::XML::Element>)
- uiml->selectChildren()
- .selectAllElements()
- .whereAttributeEquals(
- "id", "quest_rewards")
- .getFirstElement();
- bool valid = 1;
- for (auto reward : quest->rewards)
- {
- valid &= reward->validateSettings(
- rewardContainer, zStorage);
- }
- if (valid)
- {
- zStorage->setQuestRewarded(1);
- for (auto reward : quest->rewards)
- {
- reward->giveReward(rewardContainer,
- zStorage,
- Game::INSTANCE->zEntity(getPlayerId()));
- }
- auto questView = uiml->selectChildsByAttribute(
- "id", "questDetailView")
- .getFirstElement();
- questView->removeAllChilds();
- showQuestDetails(quest,
- zStorage,
- (Framework::RCPointer<Framework::XML::Element>)
- questView);
- }
- break;
- }
- }
- }
- break;
- }
- case 4: // requirement message
- {
- Framework::Text selectedId
- = uiml->selectChildsByName("listView")
- .selectChildren()
- .whereAttributeExists("selected")
- .getFirstElement()
- .map<Framework::Text>([](auto element) {
- return element->getAttributeValue("id");
- })
- .orElse("");
- QuestManager* zManager = Game::INSTANCE->zQuestManager();
- QuestCollection* questCollection
- = zManager->zCollection(Framework::TextZuInt(
- selectedId.getText() + strlen("quest_collection_"), 10));
- QuestParty* zParty = zManager->zParty(getPlayerId());
- Framework::Text questId
- = uiml->selectChildsByAttribute("id", "questDetailView")
- .getFirstElement()
- ->getAttributeValue("questId");
- unsigned char len;
- zRequest->lese((char*)&len, 1);
- char* requirementId = new char[len + 1];
- requirementId[len] = 0;
- auto requirementsContainer
- = uiml->selectChildsByAttribute("id", "quest_requirements");
- if (requirementsContainer.exists())
- {
- for (Quest* quest : questCollection->quests)
- {
- if (quest->getQuestId().istGleich(questId))
- {
- for (QuestRequirement* requirement :
- quest->requirements)
- {
- if (requirement->getRequirementId().istGleich(
- requirementId))
- {
- requirement->api(zRequest,
- (Framework::RCPointer<
- Framework::XML::Element>)
- requirementsContainer.getFirstElement(),
- zParty->zQuestStorage(questId));
- }
- }
- }
- }
- }
- delete[] requirementId;
- break;
- }
- case 5: // reward message
- {
- Framework::Text selectedId
- = uiml->selectChildsByName("listView")
- .selectChildren()
- .whereAttributeExists("selected")
- .getFirstElement()
- .map<Framework::Text>([](auto element) {
- return element->getAttributeValue("id");
- })
- .orElse("");
- QuestManager* zManager = Game::INSTANCE->zQuestManager();
- QuestCollection* questCollection
- = zManager->zCollection(Framework::TextZuInt(
- selectedId.getText() + strlen("quest_collection_"), 10));
- QuestParty* zParty = zManager->zParty(getPlayerId());
- Framework::Text questId
- = uiml->selectChildsByAttribute("id", "questDetailView")
- .getFirstElement()
- ->getAttributeValue("questId");
- unsigned char len;
- zRequest->lese((char*)&len, 1);
- char* reqardId = new char[len + 1];
- reqardId[len] = 0;
- auto requirementsContainer
- = uiml->selectChildsByAttribute("id", "quest_rewards");
- if (requirementsContainer.exists())
- {
- for (Quest* quest : questCollection->quests)
- {
- if (quest->getQuestId().istGleich(questId))
- {
- for (QuestReward* reward : quest->rewards)
- {
- if (reward->getRewardId().istGleich(reqardId))
- {
- reward->api(zRequest,
- (Framework::RCPointer<
- Framework::XML::Element>)
- requirementsContainer.getFirstElement(),
- zParty->zQuestStorage(questId));
- }
- }
- }
- }
- }
- delete[] reqardId;
- break;
- }
- }
- }
- Framework::XML::Element* QuestDialog::getQuestGraphItem(
- Quest* zQuest, QuestParty* zParty)
- {
- Framework::Text requirements = "";
- int index = 0;
- int currentGroup = 0;
- for (Framework::Text* requiredQuest : zQuest->requiredQuestsIds)
- {
- int group = zQuest->requiredQuestsGroups.get(index);
- if (index != 0)
- { // disjunctive normal form
- if (group != currentGroup)
- {
- requirements += "||";
- currentGroup = group;
- }
- else
- {
- requirements += "&&";
- }
- }
- else
- {
- currentGroup = group;
- }
- requirements += Framework::Text("quest_") + *requiredQuest;
- index++;
- }
- if (!zQuest->isActive(zParty))
- {
- return UIMLBuilder::createQuestNode()
- ->setID(Framework::Text("quest_") += zQuest->questId)
- ->setQuestName("Unknown Quest")
- ->setImagePath(zQuest->imagePath)
- ->setDescription("You have to finish other quests befor this "
- "quest will be available.")
- ->setFinished(0)
- ->setRewarded(0)
- ->setMainQuest(zQuest->mainQuest)
- ->setRequirements(requirements)
- ->setWidth(zQuest->mainQuest ? 50 : 30)
- ->setHeight(zQuest->mainQuest ? 50 : 30)
- ->build();
- }
- else
- {
- QuestStorage* zStorage = zParty->zQuestStorage(zQuest->questId);
- return UIMLBuilder::createQuestNode()
- ->setID(Framework::Text("quest_") += zQuest->questId)
- ->setQuestName(zQuest->questName)
- ->setImagePath(zQuest->imagePath)
- ->setDescription(zQuest->description)
- ->setFinished(zStorage->isQuestFinished())
- ->setRewarded(zStorage->isQuestRewarded())
- ->setMainQuest(zQuest->mainQuest)
- ->setRequirements(requirements)
- ->setWidth(zQuest->mainQuest ? 50 : 30)
- ->setHeight(zQuest->mainQuest ? 50 : 30)
- ->setOnClickMessage("quests", {1})
- ->build();
- }
- }
- void QuestDialog::showQuestDetails(
- Quest* zQuest, QuestStorage* zStorage, Framework::XML::Element* zParent)
- {
- zParent->setAttribute("title", zQuest->questName);
- zParent->addChild(UIMLBuilder::createText(zQuest->description)
- ->setID("quest_description")
- ->setWidth(50, -15)
- ->setHeight(50, -10)
- ->setAlignLeftStart()
- ->setMarginLeft(10)
- ->setAlignTopStart()
- ->setMarginTop(10)
- ->setBorder(1, 0xFF52525E)
- ->enableVerticalScrollbar()
- ->setStyle(Framework::TextFeld::Style::Text
- | Framework::TextFeld::Style::Mehrzeilig
- | Framework::TextFeld::Style::AutoLineBreak)
- ->build());
- UIMLContainerBuilder* requirementsContainerBuilder
- = UIMLBuilder::createContainer()
- ->setID("quest_requirements")
- ->setAlignLeftToElement("quest_description")
- ->setMarginLeft(10)
- ->setAlignTopStart()
- ->setMarginTop(10)
- ->setWidth(50, -15)
- ->setHeight(100, -50)
- ->setDisplayAsColumn(0, 10)
- ->setBorder(1, 0xFF52525E)
- ->setStyle(Framework::Fenster::Style::Sichtbar
- | Framework::Fenster::Style::Erlaubt
- | Framework::Fenster::Style::Rahmen)
- ->enableVerticalScrollbar()
- ->addChild(UIMLBuilder::createText("Requirements")
- ->setID("quest_requirements_title")
- ->setWidthPercentage(100)
- ->setHeight(30)
- ->setStyle(Framework::TextFeld::Style::Text
- | Framework::TextFeld::Style::Center)
- ->setFontSize(20)
- ->build());
- for (QuestRequirement* requirement : zQuest->requirements)
- {
- requirement->addRequirementUIML(zStorage, requirementsContainerBuilder);
- }
- zParent->addChild(requirementsContainerBuilder->build());
- UIMLContainerBuilder* rewardsContainerBuilder
- = UIMLBuilder::createContainer()
- ->setID("quest_rewards")
- ->setAlignLeftStart()
- ->setMarginLeft(10)
- ->setAlignTopToElement("quest_description")
- ->setMarginTop(10)
- ->setWidth(50, -15)
- ->setHeight(50, -20)
- ->setDisplayAsColumn(0, 10)
- ->setBorder(1, 0xFF52525E)
- ->setStyle(Framework::Fenster::Style::Sichtbar
- | Framework::Fenster::Style::Erlaubt
- | Framework::Fenster::Style::Rahmen)
- ->enableVerticalScrollbar()
- ->addChild(UIMLBuilder::createText("Rewards")
- ->setID("quest_rewards_title")
- ->setWidthPercentage(100)
- ->setHeight(30)
- ->setStyle(Framework::TextFeld::Style::Text
- | Framework::TextFeld::Style::Center)
- ->setFontSize(20)
- ->build());
- for (QuestReward* reward : zQuest->rewards)
- {
- reward->addRewardUIML(rewardsContainerBuilder, zStorage);
- }
- zParent->addChild(rewardsContainerBuilder->build());
- zParent->addChild(UIMLBuilder::createButton("Back")
- ->setID("back_to_graph")
- ->setWidth(100)
- ->setHeight(20)
- ->setAlignRightEnd()
- ->setMarginRight(10)
- ->setAlignTopToElement("quest_requirements")
- ->setMarginTop(10)
- ->setOnClickMessage("quests", {2})
- ->build());
- if (zStorage->isQuestFinished() && !zStorage->isQuestRewarded())
- {
- zParent->addChild(UIMLBuilder::createButton("Give rewards")
- ->setID("give_rewards")
- ->setWidth(100)
- ->setHeight(20)
- ->setAlignLeftToElement("quest_rewards")
- ->setMarginLeft(10)
- ->setAlignTopToElement("quest_requirements")
- ->setMarginTop(10)
- ->setOnClickMessage("quests", {3})
- ->build());
- }
- update();
- }
|