فهرست منبع

add recipie group configs

Kolja Strohm 4 ماه پیش
والد
کامیت
fb1a71308f

+ 2 - 0
FactoryCraft/FactoryCraft.vcxproj

@@ -192,6 +192,7 @@
     <ClInclude Include="QuestReward.h" />
     <ClInclude Include="RandNoise.h" />
     <ClInclude Include="Recipie.h" />
+    <ClInclude Include="RecipieGroupConfig.h" />
     <ClInclude Include="RecipieList.h" />
     <ClInclude Include="RecipieLoader.h" />
     <ClInclude Include="SaveCommand.h" />
@@ -315,6 +316,7 @@
     <ClCompile Include="QuestEvent.cpp" />
     <ClCompile Include="QuestRequirement.cpp" />
     <ClCompile Include="QuestReward.cpp" />
+    <ClCompile Include="RecipieGroupConfig.cpp" />
     <ClCompile Include="RecipieList.cpp" />
     <ClCompile Include="RandNoise.cpp" />
     <ClCompile Include="Recipie.cpp" />

+ 6 - 0
FactoryCraft/FactoryCraft.vcxproj.filters

@@ -510,6 +510,9 @@
     <ClInclude Include="UIObservable.h">
       <Filter>UI\Observable</Filter>
     </ClInclude>
+    <ClInclude Include="RecipieGroupConfig.h">
+      <Filter>inventory\recipies</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Server.cpp">
@@ -881,5 +884,8 @@
     <ClCompile Include="UIObservable.cpp">
       <Filter>UI\Observable</Filter>
     </ClCompile>
+    <ClCompile Include="RecipieGroupConfig.cpp">
+      <Filter>inventory\recipies</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>

+ 2 - 2
FactoryCraft/Game.cpp

@@ -342,7 +342,7 @@ void Game::initialize()
     multiblockStructureTypeCount = 1;
     // save syntax info
     Framework::DateiRemove("data/syntax");
-    typeRegistry->writeSyntaxInfo("data/syntax");
+    // typeRegistry->writeSyntaxInfo("data/syntax");
 
     validator
         = Framework::Validator::DataValidator::buildForArray()
@@ -391,7 +391,7 @@ void Game::initialize()
     generator = new WorldGenerator(seed);
     loader = new WorldLoader();
     // load recipies
-    recipies->loadRecipies("data/recipies");
+    recipies->loadRecipies("data");
     // initialize chat
     chat = new Chat();
     // load quests

+ 1 - 0
FactoryCraft/Recipie.cpp

@@ -5,6 +5,7 @@
 #include "CraftingStorage.h"
 #include "Game.h"
 #include "Item.h"
+#include "RecipieGroupConfig.h"
 #include "UIElement.h"
 
 RecipieInput::RecipieInput()

+ 62 - 0
FactoryCraft/RecipieGroupConfig.cpp

@@ -0,0 +1,62 @@
+#include "RecipieGroupConfig.h"
+
+#include "Game.h"
+
+RecipieGroupConfig::RecipieGroupConfig()
+    : Framework::ReferenceCounter()
+{}
+
+void RecipieGroupConfig::setGroupName(const Framework::Text& groupName)
+{
+    this->groupName = groupName;
+}
+
+const Framework::Text& RecipieGroupConfig::getGroupName() const
+{
+    return groupName;
+}
+
+void RecipieGroupConfig::setIconItemType(const Framework::Text& iconItemType)
+{
+    this->iconItemType = iconItemType;
+}
+
+const Framework::Text& RecipieGroupConfig::getIconItemType() const
+{
+    return iconItemType;
+}
+
+RecipieGroupConfigFactory::RecipieGroupConfigFactory()
+    : ObjectTypeFactory<RecipieGroupConfig>()
+{}
+
+RecipieGroupConfig* RecipieGroupConfigFactory::fromJson(
+    Framework::JSON::JSONObject* zJson) const
+{
+    RecipieGroupConfig* config = new RecipieGroupConfig();
+    config->setGroupName(zJson->zValue("groupName")->asString()->getString());
+    config->setIconItemType(
+        zJson->zValue("iconItemType")->asString()->getString());
+    return config;
+}
+
+Framework::JSON::JSONObject* RecipieGroupConfigFactory::toJsonObject(
+    RecipieGroupConfig* zObject) const
+{
+    Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
+    result->addValue("groupName",
+        new Framework::JSON::JSONString(zObject->getGroupName().getText()));
+    result->addValue("iconItemType",
+        new Framework::JSON::JSONString(zObject->getIconItemType().getText()));
+    return result;
+}
+
+JSONObjectValidationBuilder* RecipieGroupConfigFactory::addToValidator(
+    JSONObjectValidationBuilder* builder) const
+{
+    return builder->withRequiredString("groupName")
+        ->finishString()
+        ->withRequiredAttribute("iconItemType",
+            Game::INSTANCE->zTypeRegistry()->getValidator<Framework::Text>(
+                ItemTypeNameFactory::TYPE_ID));
+}

+ 31 - 0
FactoryCraft/RecipieGroupConfig.h

@@ -0,0 +1,31 @@
+#pragma once
+
+#include <Text.h>
+
+#include "TypeRegistry.h"
+
+class RecipieGroupConfig : public Framework::ReferenceCounter
+{
+private:
+    Framework::Text groupName;
+    Framework::Text iconItemType;
+
+public:
+    RecipieGroupConfig();
+    void setGroupName(const Framework::Text& groupName);
+    const Framework::Text& getGroupName() const;
+    void setIconItemType(const Framework::Text& iconItemType);
+    const Framework::Text& getIconItemType() const;
+};
+
+class RecipieGroupConfigFactory : public ObjectTypeFactory<RecipieGroupConfig>
+{
+public:
+    RecipieGroupConfigFactory();
+    RecipieGroupConfig* fromJson(
+        Framework::JSON::JSONObject* zJson) const override;
+    Framework::JSON::JSONObject* toJsonObject(
+        RecipieGroupConfig* zObject) const override;
+    JSONObjectValidationBuilder* addToValidator(
+        JSONObjectValidationBuilder* builder) const override;
+};

+ 80 - 22
FactoryCraft/RecipieLoader.cpp

@@ -13,25 +13,64 @@ using namespace Framework::JSON;
 using namespace Framework::Validator;
 
 RecipieLoader::RecipieLoader()
-    : Framework::ReferenceCounter(),
-      validator(0)
+    : Framework::ReferenceCounter()
 {}
 
-RecipieLoader::~RecipieLoader()
-{
-    if (validator) validator->release();
-}
+RecipieLoader::~RecipieLoader() {}
 
 void RecipieLoader::loadRecipies(const char* path)
 {
     DataValidator* validator
+        = Framework::Validator::DataValidator::buildForArray()
+              ->addAcceptedTypeInArray(Game::INSTANCE->zTypeRegistry()
+                      ->getValidator<RecipieGroupConfig>())
+              ->removeInvalidEntries()
+              ->finishArray();
+    loadAllJsonsFromDirectory(Framework::Text(path) + "/recipieGroups",
+        [this, &validator](JSONValue* zJson, Framework::Text path) {
+            Framework::Logging::info()
+                << "loading recipie groups from '" << path << "'";
+            Framework::RCArray<ValidationResult> invalidParts;
+            JSONValue* valid = validator->getValidParts(zJson, &invalidParts);
+            for (ValidationResult* invalidPart : invalidParts)
+            {
+                Framework::Logging::error() << invalidPart->getInvalidInfo();
+            }
+            int count = 0;
+            if (valid)
+            {
+                for (JSONValue* value : *valid->asArray())
+                {
+                    RecipieGroupConfig* recipieGroup
+                        = Game::INSTANCE->zTypeRegistry()
+                              ->fromJson<RecipieGroupConfig>(value);
+                    if (recipieGroup)
+                    {
+                        groupConfigs.add(recipieGroup);
+                        count++;
+                    }
+                }
+            }
+            Framework::Logging::info()
+                << count << " recipie groups were loaded.";
+        });
+    Framework::JSON::JSONObject* schema = validator->getJsonSchema();
+    Framework::Datei syntaxFile;
+    syntaxFile.setDatei("data/syntax/schema/recipieGroups.json");
+    syntaxFile.erstellen();
+    syntaxFile.open(Framework::Datei::Style::schreiben);
+    syntaxFile.schreibe(schema->toString(), schema->toString().getLength());
+    syntaxFile.close();
+    schema->release();
+    validator->release();
+    validator
         = Framework::Validator::DataValidator::buildForArray()
               ->addAcceptedTypeInArray(
                   Game::INSTANCE->zTypeRegistry()->getValidator<Recipie>())
               ->removeInvalidEntries()
               ->finishArray();
-    loadAllJsonsFromDirectory(
-        path, [this, &validator](JSONValue* zJson, Framework::Text path) {
+    loadAllJsonsFromDirectory(Framework::Text(path) + "/recipies",
+        [this, &validator](JSONValue* zJson, Framework::Text path) {
             Framework::Logging::info()
                 << "loading recipies from '" << path << "'";
             Framework::RCArray<ValidationResult> invalidParts;
@@ -64,8 +103,7 @@ void RecipieLoader::loadRecipies(const char* path)
             }
             Framework::Logging::info() << count << " recipies were loaded.";
         });
-    Framework::JSON::JSONObject* schema = validator->getJsonSchema();
-    Framework::Datei syntaxFile;
+    schema = validator->getJsonSchema();
     syntaxFile.setDatei("data/syntax/schema/recipies.json");
     syntaxFile.erstellen();
     syntaxFile.open(Framework::Datei::Style::schreiben);
@@ -73,6 +111,25 @@ void RecipieLoader::loadRecipies(const char* path)
     syntaxFile.close();
     schema->release();
     validator->release();
+    for (RecipieList* list : lists)
+    {
+        bool found = 0;
+        for (RecipieGroupConfig* groupConfig : groupConfigs)
+        {
+            if (list->getName().istGleich(groupConfig->getGroupName()))
+            {
+                found = 1;
+                break;
+            }
+        }
+        if (!found)
+        {
+            Framework::Logging::warning()
+                << "Recipie list '" << list->getName()
+                << "' has no group config. The recipies can not be viewed by "
+                   "the client.";
+        }
+    }
 }
 
 RecipieList* RecipieLoader::zRecipieList(const char* name) const
@@ -101,20 +158,21 @@ Framework::Text RecipieLoader::getCrafingUIML(int itemTypeId)
         list->findRecipies(itemTypeId, recipies);
         if (recipies.getEintragAnzahl() > 0)
         {
-            result.append()
-                << "<craftingRecipieGroup name=\"" << list->getName();
-            if (list->getName().istGleich("inventory"))
+            for (RecipieGroupConfig* groupConfig : groupConfigs)
             {
-                result.append()
-                    << "\" itemIcon=\""
-                    << Game::INSTANCE->getItemTypeId("Crafting Table");
-            }
-            result += "\">";
-            for (Recipie* recipie : recipies)
-            {
-                result += recipie->getRecipieUIML();
+                if (list->getName().istGleich(groupConfig->getGroupName()))
+                {
+                    result.append() << "<craftingRecipieGroup name=\""
+                                    << list->getName() << "\" itemIcon=\""
+                                    << groupConfig->getIconItemType() << "\">";
+                    for (Recipie* recipie : recipies)
+                    {
+                        result += recipie->getRecipieUIML();
+                    }
+                    result += "</craftingRecipieGroup>";
+                    break;
+                }
             }
-            result += "</craftingRecipieGroup>";
         }
     }
     result += "</craftingRecipies></dialog>";

+ 2 - 1
FactoryCraft/RecipieLoader.h

@@ -1,13 +1,14 @@
 #pragma once
 #include <Array.h>
 
+#include "RecipieGroupConfig.h"
 #include "RecipieList.h"
 
 class RecipieLoader : public virtual Framework::ReferenceCounter
 {
 private:
     Framework::RCArray<RecipieList> lists;
-    Framework::Validator::DataValidator* validator;
+    Framework::RCArray<RecipieGroupConfig> groupConfigs;
 
 public:
     RecipieLoader();

+ 2 - 0
FactoryCraft/TypeRegistry.cpp

@@ -32,6 +32,7 @@
 #include "PlaceableProof.h"
 #include "Quest.h"
 #include "Recipie.h"
+#include "RecipieGroupConfig.h"
 #include "SpecificItemDrop.h"
 #include "TreeSeblingBlock.h"
 #include "TreeTemplate.h"
@@ -99,6 +100,7 @@ TypeRegistry::TypeRegistry()
     registerSubType(new FluidContainerItemSkillFactory());
 
     // reipies
+    registerType(new RecipieGroupConfigFactory());
     registerType(new RecipieInputFactory());
     registerType(new RecipieOutputFactory());
     registerSubType(new ShapedRecipieFactory());

+ 2 - 0
Windows Version/Windows Version.vcxproj

@@ -248,6 +248,7 @@ copy ..\..\..\..\..\Allgemein\Framework\x64\release\Framework.dll Framework.dll<
     <ClCompile Include="..\FactoryCraft\QuestEvent.cpp" />
     <ClCompile Include="..\FactoryCraft\QuestRequirement.cpp" />
     <ClCompile Include="..\FactoryCraft\QuestReward.cpp" />
+    <ClCompile Include="..\FactoryCraft\RecipieGroupConfig.cpp" />
     <ClCompile Include="..\FactoryCraft\RecipieList.cpp" />
     <ClCompile Include="..\FactoryCraft\RandNoise.cpp" />
     <ClCompile Include="..\FactoryCraft\Recipie.cpp" />
@@ -380,6 +381,7 @@ copy ..\..\..\..\..\Allgemein\Framework\x64\release\Framework.dll Framework.dll<
     <ClInclude Include="..\FactoryCraft\QuestReward.h" />
     <ClInclude Include="..\FactoryCraft\RandNoise.h" />
     <ClInclude Include="..\FactoryCraft\Recipie.h" />
+    <ClInclude Include="..\FactoryCraft\RecipieGroupConfig.h" />
     <ClInclude Include="..\FactoryCraft\RecipieList.h" />
     <ClInclude Include="..\FactoryCraft\RecipieLoader.h" />
     <ClInclude Include="..\FactoryCraft\SaveCommand.h" />

+ 6 - 0
Windows Version/Windows Version.vcxproj.filters

@@ -495,6 +495,9 @@
     <ClCompile Include="..\FactoryCraft\UIObservable.cpp">
       <Filter>UI\Observable</Filter>
     </ClCompile>
+    <ClCompile Include="..\FactoryCraft\RecipieGroupConfig.cpp">
+      <Filter>inventory\recipies</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\FactoryCraft\Chunk.h">
@@ -881,5 +884,8 @@
     <ClInclude Include="..\FactoryCraft\UIObservable.h">
       <Filter>UI\Observable</Filter>
     </ClInclude>
+    <ClInclude Include="..\FactoryCraft\RecipieGroupConfig.h">
+      <Filter>inventory\recipies</Filter>
+    </ClInclude>
   </ItemGroup>
 </Project>

+ 10 - 0
Windows Version/data/recipieGroups/groups.json

@@ -0,0 +1,10 @@
+[
+    {
+        "groupName": "inventory",
+        "iconItemType": "Crafting Table"
+    },
+    {
+        "groupName": "fire",
+        "iconItemType": "Campfire"
+    }
+]