Browse Source

add uiml for quest dialog

Kolja Strohm 10 months ago
parent
commit
fdb767b8dd

+ 62 - 4
FactoryCraft/Player.cpp

@@ -250,6 +250,9 @@ void Player::playerApi(
         }
     case 4:
         {
+            Game::INSTANCE->zQuestManager()->processEvent(
+                new QuestEventOpenDialog(
+                    dynamic_cast<Entity*>(getThis()), "player_inventory"));
             // open inventory
             zResponse->openDialog("player_inventory");
             Text uiml = getInventoryUIML();
@@ -258,9 +261,6 @@ void Player::playerApi(
             *(int*)msg = uiml.getLength();
             memcpy(msg + 4, uiml.getText(), uiml.getLength());
             zResponse->setMessage(msg, msgSize);
-            Game::INSTANCE->zQuestManager()->processEvent(
-                new QuestEventOpenDialog(
-                    dynamic_cast<Entity*>(getThis()), "player_inventory"));
             break;
         }
     case 5:
@@ -367,7 +367,65 @@ void Player::playerApi(
         }
     case 9: // open quest dialog
         {
-            // TODO: open quest dialog
+            Game::INSTANCE->zQuestManager()->processEvent(
+                new QuestEventOpenDialog(
+                    dynamic_cast<Entity*>(getThis()), "quests"));
+            zResponse->openDialog("quests");
+            Text uiml = Game::INSTANCE->zQuestManager()->getDialogUIML(this);
+            int msgSize = 4 + uiml.getLength();
+            char* msg = new char[msgSize];
+            *(int*)msg = uiml.getLength();
+            memcpy(msg + 4, uiml.getText(), uiml.getLength());
+            zResponse->setMessage(msg, msgSize);
+            break;
+        }
+    case 10: // request quest graph
+        {
+            unsigned char length;
+            zRequest->lese((char*)&length, 1);
+            char* collectionName = new char[length + 1];
+            zRequest->lese(collectionName, length);
+            collectionName[length] = 0;
+            Framework::Text uiml
+                = Game::INSTANCE->zQuestManager()->getQuestGraphUIML(
+                    this, collectionName);
+            delete[] collectionName;
+            zRequest->lese((char*)&length, 1);
+            char* guiId = new char[(int)length + 1];
+            zRequest->lese(guiId, length);
+            guiId[(int)length] = 0;
+            zResponse->addressGui(guiId);
+            delete[] guiId;
+            int msgSize = 4 + uiml.getLength();
+            char* msg = new char[msgSize];
+            *(int*)msg = uiml.getLength();
+            memcpy(msg + 4, uiml.getText(), uiml.getLength());
+            zResponse->setMessage(msg, msgSize);
+            break;
+        }
+    case 11: // request quest view
+        {
+            unsigned char length;
+            zRequest->lese((char*)&length, 1);
+            char* questName = new char[length + 1];
+            zRequest->lese(questName, length);
+            questName[length] = 0;
+            Framework::Text uiml
+                = Game::INSTANCE->zQuestManager()->getQuestViewUIML(
+                    this, questName);
+            delete[] questName;
+            zRequest->lese((char*)&length, 1);
+            char* guiId = new char[(int)length + 1];
+            zRequest->lese(guiId, length);
+            guiId[(int)length] = 0;
+            zResponse->addressGui(guiId);
+            delete[] guiId;
+            int msgSize = 4 + uiml.getLength();
+            char* msg = new char[msgSize];
+            *(int*)msg = uiml.getLength();
+            memcpy(msg + 4, uiml.getText(), uiml.getLength());
+            zResponse->setMessage(msg, msgSize);
+            break;
         }
     }
 }

+ 150 - 16
FactoryCraft/Quest.cpp

@@ -368,6 +368,47 @@ const Framework::Text& Quest::getQuestId() const
     return questId;
 }
 
+Framework::Text Quest::getQuestGraphItemUIML(QuestStorage* zStorage)
+{
+    Framework::Text requirements = "";
+    for (Framework::Text* requiredQuest : requiredQuestsIds)
+    {
+        if (requirements.getLength() > 0)
+        {
+            requirements += ",";
+        }
+        requirements += *requiredQuest;
+    }
+
+    Framework::Text result = "<questGraphItem id=\"";
+    result.append() << questId << "\" name=\"" << questName + "\" image=\""
+                    << imagePath << "\" description=\"" << description
+                    << "\" finished=\"" << zStorage->isQuestFinished()
+                    << "\" mainQuest=\"" << mainQuest << "\" requirements=\""
+                    << requirements << "\"/>";
+    return result;
+}
+
+Framework::Text Quest::getQuestViewUIML(QuestStorage* zStorage)
+{
+    Framework::Text result = "<questView id=\"";
+    result.append() << questId << "\" name=\"" << questName + "\" description=\"" << description
+					<< "\" finished=\"" << zStorage->isQuestFinished()
+                    << "\" rewarded=\"" << zStorage ->isQuestRewarded() << "\">";
+    for (QuestRequirement* requirement : requirements)
+    {
+        result += requirement->getRequirementUIML(
+			zStorage->zStorage(requirement->getRequirementId()));
+    }
+    for (QuestReward* reward : rewards)
+    {
+        result += reward->getRewardUIML();
+    }
+
+	result += "</questView>";
+	return result;
+}
+
 QuestType::QuestType()
     : TypeFactory<Quest>()
 {}
@@ -517,6 +558,39 @@ void QuestCollection::addQuest(Quest* zQuest)
     quests.add(zQuest);
 }
 
+const Framework::Text& QuestCollection::getName() const
+{
+    return name;
+}
+
+Framework::Text QuestCollection::getQuestGraphUIML(QuestParty* zParty)
+{
+    Framework::Text result = "";
+    for (Quest* quest : quests)
+    {
+        if (quest->isVisible(zParty))
+        {
+            QuestStorage* zStorage = zParty->zQuestStorage(quest->getQuestId());
+            result += quest->getQuestGraphItemUIML(zStorage);
+        }
+    }
+    return result;
+}
+
+Framework::Text QuestCollection::getQuestViewUIML(
+    QuestParty* zParty, Framework::Text questId)
+{
+    for (Quest* quest : quests)
+    {
+        if (quest->getQuestId().istGleich(questId))
+        {
+            QuestStorage* zStorage = zParty->zQuestStorage(quest->getQuestId());
+            return quest->getQuestViewUIML(zStorage);
+        }
+    }
+    return "";
+}
+
 QuestCollectionType::QuestCollectionType()
     : TypeFactory<QuestCollection>()
 {}
@@ -568,6 +642,18 @@ QuestManager::QuestManager()
     : ReferenceCounter()
 {}
 
+QuestParty* QuestManager::zParty(int entityId)
+{
+    for (QuestParty* party : parties)
+    {
+        if (party->isMember(entityId))
+        {
+            return party;
+        }
+    }
+    return 0;
+}
+
 void QuestManager::loadQuests()
 {
     Framework::Text worldDir = Game::INSTANCE->getWorldDirectory();
@@ -694,16 +780,12 @@ void QuestManager::saveQuests()
 
 void QuestManager::processEvent(QuestEvent* event)
 {
-    Entity* zEntity = event->zActingEntity();
-    for (QuestParty* party : parties)
+    QuestParty* party = zParty(event->zActingEntity()->getId());
+    if (party)
     {
-        if (party->isMember(zEntity->getId()))
+        for (QuestCollection* questCollection : questCollections)
         {
-            for (QuestCollection* questCollection : questCollections)
-            {
-                questCollection->processEvent(event, party);
-            }
-            break;
+            questCollection->processEvent(event, party);
         }
     }
     event->release();
@@ -712,16 +794,68 @@ void QuestManager::processEvent(QuestEvent* event)
 void QuestManager::giveReward(
     Framework::Text questId, int choice, Entity* zTargetEntity)
 {
-    for (QuestParty* party : parties)
+    QuestParty* party = zParty(zTargetEntity->getId());
+    if (party)
     {
-        if (party->isMember(zTargetEntity->getId()))
+        for (QuestCollection* questCollection : questCollections)
         {
-            for (QuestCollection* questCollection : questCollections)
-            {
-                questCollection->giveReward(
-                    questId, choice, zTargetEntity, party);
-            }
-            return;
+            questCollection->giveReward(questId, choice, zTargetEntity, party);
+        }
+    }
+}
+
+Framework::Text QuestManager::getDialogUIML(Entity* zTargetEntity)
+{
+    Framework::Text result = "<dialog id=\"quests\" title=\"Quests\" "
+                             "width=\"1200\" height=\"800\">";
+    result.append()
+        << "<listView id=\"collectionList\" width=\"100%\" height=\"100%\" "
+           "member-width=\"200\" member-height=\"40\" align-top=\"start\" "
+           "align-left=\"start\">";
+    QuestParty* party = zParty(zTargetEntity->getId());
+    for (QuestCollection* questCollection : questCollections)
+    {
+        if (questCollection->isVisible(party))
+        {
+            result.append()
+                << "<listItem id=\"" << questCollection->getName() << "\">"
+                << "<itemTitle>"
+                << "<text>" << questCollection->getName() << "</text>"
+                << "</itemTitle>"
+                << "<itemContent>"
+                << "<questGraph collectionName=\"" << questCollection->getName()
+                << "\"/>"
+                << "</itemContent>"
+                << "</listItem>";
+        }
+    }
+    result.append() << "</listView>"
+                    << "</dialog>";
+    return result;
+}
+
+Framework::Text QuestManager::getQuestGraphUIML(
+    Entity* zTargetEntity, Framework::Text collectionName)
+{
+    QuestParty* party = zParty(zTargetEntity->getId());
+    for (QuestCollection* questCollection : questCollections)
+    {
+        if (questCollection->getName().istGleich(collectionName))
+        {
+            return questCollection->getQuestGraphUIML(party);
         }
     }
+    return "";
+}
+
+Framework::Text QuestManager::getQuestViewUIML(
+    Entity* zTargetEntity, Framework::Text questId)
+{
+    Framework::Text result = "";
+    QuestParty* party = zParty(zTargetEntity->getId());
+    for (QuestCollection* questCollection : questCollections)
+    {
+        result += questCollection->getQuestViewUIML(party, questId);
+    }
+    return result;
 }

+ 20 - 8
FactoryCraft/Quest.h

@@ -69,10 +69,8 @@ class QuestStorageType : public TypeFactory<QuestStorage>
 {
 public:
     QuestStorageType();
-    QuestStorage* fromJson(
-        Framework::JSON::JSONValue* zJson) const override;
-    Framework::JSON::JSONValue* toJson(
-        QuestStorage* zObject) const override;
+    QuestStorage* fromJson(Framework::JSON::JSONValue* zJson) const override;
+    Framework::JSON::JSONValue* toJson(QuestStorage* zObject) const override;
     Framework::JSON::Validator::JSONValidator* getValidator() const override;
 };
 
@@ -114,6 +112,8 @@ private:
     Framework::Text questId;
     Framework::Text questName;
     Framework::Text description;
+    Framework::Text imagePath;
+    bool mainQuest;
     Framework::RCArray<Framework::Text> requiredQuestsIds;
     Framework::RCArray<QuestRequirement> requirements;
     Framework::RCArray<QuestReward> rewards;
@@ -125,6 +125,8 @@ public:
     bool isVisible(QuestParty* zParty);
     void giveReward(int choice, Entity* zTargetEntity, QuestStorage* zStorage);
     const Framework::Text& getQuestId() const;
+    Framework::Text getQuestGraphItemUIML(QuestStorage* zStorage);
+    Framework::Text getQuestViewUIML(QuestStorage* zStorage);
 
     friend QuestType;
 };
@@ -157,6 +159,11 @@ public:
         QuestParty* zParty);
     void addQuest(Quest* zQuest);
 
+    const Framework::Text& getName() const;
+    Framework::Text getQuestGraphUIML(QuestParty* zParty);
+    Framework::Text getQuestViewUIML(
+        QuestParty* zParty, Framework::Text questId);
+
     friend QuestCollectionType;
 };
 
@@ -164,10 +171,8 @@ class QuestCollectionType : public TypeFactory<QuestCollection>
 {
 public:
     QuestCollectionType();
-    QuestCollection* fromJson(
-        Framework::JSON::JSONValue* zJson) const override;
-    Framework::JSON::JSONValue* toJson(
-        QuestCollection* zObject) const override;
+    QuestCollection* fromJson(Framework::JSON::JSONValue* zJson) const override;
+    Framework::JSON::JSONValue* toJson(QuestCollection* zObject) const override;
     Framework::JSON::Validator::JSONValidator* getValidator() const override;
 };
 
@@ -177,6 +182,8 @@ private:
     Framework::RCArray<QuestCollection> questCollections;
     Framework::RCArray<QuestParty> parties;
 
+    QuestParty* zParty(int entityId);
+
 public:
     QuestManager();
 
@@ -185,4 +192,9 @@ public:
 
     void processEvent(QuestEvent* event);
     void giveReward(Framework::Text questId, int choice, Entity* zTargetEntity);
+    Framework::Text getDialogUIML(Entity* zTargetEntity);
+    Framework::Text getQuestGraphUIML(
+        Entity* zTargetEntity, Framework::Text collectionName);
+    Framework::Text getQuestViewUIML(
+        Entity* zTargetEntity, Framework::Text questId);
 };

+ 12 - 2
FactoryCraft/QuestRequirement.cpp

@@ -38,6 +38,16 @@ void QuestRequirementOpenDialog::processEvent(
     }
 }
 
+Framework::Text QuestRequirementOpenDialog::getRequirementUIML(
+    QuestRequirementStorage* zStorage)
+{
+    Framework::Text result = "<questRequirement id=\"";
+    result.append() << id << "\" fullfilled=\"" << zStorage->isFullfilled()
+                    << "\"><text>" << description
+                    << "</text></questRequirement>";
+    return result;
+}
+
 QuestRequirementOpenDialogType::QuestRequirementOpenDialogType()
     : SubTypeFactory()
 {}
@@ -57,8 +67,8 @@ Framework::JSON::JSONObject* QuestRequirementOpenDialogType::toJson(
     Framework::JSON::JSONObject* json = new Framework::JSON::JSONObject();
     json->addValue(
         "id", new Framework::JSON::JSONString(zObject->getRequirementId()));
-    json->addValue(
-        "description", new Framework::JSON::JSONString(zObject->getDescription()));
+    json->addValue("description",
+        new Framework::JSON::JSONString(zObject->getDescription()));
     json->addValue(
         "dialogId", new Framework::JSON::JSONString(zObject->dialogId));
     return json;

+ 6 - 1
FactoryCraft/QuestRequirement.h

@@ -7,7 +7,7 @@ class QuestRequirementStorage;
 
 class QuestRequirement : public virtual Framework::ReferenceCounter
 {
-private:
+protected:
     Framework::Text id;
     Framework::Text description;
 
@@ -16,6 +16,9 @@ public:
     virtual void processEvent(
         QuestEvent* zEvent, QuestRequirementStorage* zStorage)
         = 0;
+    virtual Framework::Text getRequirementUIML(
+        QuestRequirementStorage* zStorage)
+        = 0;
     const Framework::Text& getRequirementId() const;
     const Framework::Text& getDescription() const;
 };
@@ -33,6 +36,8 @@ public:
         Framework::Text dialogId);
     void processEvent(
         QuestEvent* zEvent, QuestRequirementStorage* zStorage) override;
+    Framework::Text getRequirementUIML(
+        QuestRequirementStorage* zStorage) override;
 
     friend QuestRequirementOpenDialogType;
 };

+ 15 - 0
FactoryCraft/QuestReward.cpp

@@ -94,6 +94,21 @@ void QuestRewardGiveItems::giveReward(Entity* zTargetEntity)
     }
 }
 
+Framework::Text QuestRewardGiveItems::getRewardUIML()
+{
+    Framework::Text result = "<questReward>";
+    for (ItemStackInfo* info : items)
+    {
+        result.append() << "<itemStack count=\"" << info->getCount()
+                        << "\" itemImage=\""
+                        << info->zItem()->zItemType()->getId() << "\"><text>"
+                        << info->zItem()->getName() << "</text>"
+                        << info->zItem()->getTooltipUIML() << "</itemStack>";
+    }
+    result += "</questReward>";
+    return result;
+}
+
 QuestRewardGiveItemsType::QuestRewardGiveItemsType()
     : SubTypeFactory<QuestReward, QuestRewardGiveItems>()
 {}

+ 3 - 1
FactoryCraft/QuestReward.h

@@ -7,13 +7,14 @@ class Item;
 
 class QuestReward : public virtual Framework::ReferenceCounter
 {
-private:
+protected:
     Framework::Text rewardId;
 
 public:
     QuestReward(Framework::Text rewardId);
 
     virtual void giveReward(Entity* zTargetEntity) = 0;
+    virtual Framework::Text getRewardUIML() = 0;
 
     const Framework::Text& getRewardId() const;
 };
@@ -51,6 +52,7 @@ public:
     QuestRewardGiveItems(Framework::Text rewardId);
 
     void giveReward(Entity* zTargetEntity) override;
+    Framework::Text getRewardUIML() override;
 
     friend QuestRewardGiveItemsType;
 };