RecipieLoader.cpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. #include "RecipieLoader.h"
  2. #include <Datei.h>
  3. #include <iostream>
  4. #include <Logging.h>
  5. #include <stdexcept>
  6. #include "Game.h"
  7. #include "ItemType.h"
  8. #include "JsonUtils.h"
  9. using namespace Framework::JSON;
  10. using namespace Framework::Validator;
  11. RecipieLoader::RecipieLoader()
  12. : Framework::ReferenceCounter()
  13. {}
  14. RecipieLoader::~RecipieLoader() {}
  15. void RecipieLoader::loadRecipies(const char* path)
  16. {
  17. DataValidator* validator
  18. = Framework::Validator::DataValidator::buildForArray()
  19. ->addAcceptedTypeInArray(Game::INSTANCE->zTypeRegistry()
  20. ->getValidator<RecipieGroupConfig>())
  21. ->removeInvalidEntries()
  22. ->finishArray();
  23. loadAllJsonsFromDirectory(Framework::Text(path) + "/recipieGroups",
  24. [this, &validator](JSONValue* zJson, Framework::Text path) {
  25. Framework::Logging::info()
  26. << "loading recipie groups from '" << path << "'";
  27. Framework::RCArray<ValidationResult> invalidParts;
  28. JSONValue* valid = validator->getValidParts(zJson, &invalidParts);
  29. for (ValidationResult* invalidPart : invalidParts)
  30. {
  31. Framework::Logging::error() << invalidPart->getInvalidInfo();
  32. }
  33. int count = 0;
  34. if (valid)
  35. {
  36. for (JSONValue* value : *valid->asArray())
  37. {
  38. RecipieGroupConfig* recipieGroup
  39. = Game::INSTANCE->zTypeRegistry()
  40. ->fromJson<RecipieGroupConfig>(value);
  41. if (recipieGroup)
  42. {
  43. groupConfigs.add(recipieGroup);
  44. count++;
  45. }
  46. }
  47. }
  48. Framework::Logging::info()
  49. << count << " recipie groups were loaded.";
  50. });
  51. Framework::JSON::JSONObject* schema = validator->getJsonSchema();
  52. Framework::Datei syntaxFile;
  53. syntaxFile.setDatei("data/syntax/schema/recipieGroups.json");
  54. syntaxFile.erstellen();
  55. syntaxFile.open(Framework::Datei::Style::schreiben);
  56. syntaxFile.schreibe(schema->toString(), schema->toString().getLength());
  57. syntaxFile.close();
  58. schema->release();
  59. validator->release();
  60. validator
  61. = Framework::Validator::DataValidator::buildForArray()
  62. ->addAcceptedTypeInArray(
  63. Game::INSTANCE->zTypeRegistry()->getValidator<Recipie>())
  64. ->removeInvalidEntries()
  65. ->finishArray();
  66. loadAllJsonsFromDirectory(Framework::Text(path) + "/recipies",
  67. [this, &validator](JSONValue* zJson, Framework::Text path) {
  68. Framework::Logging::info()
  69. << "loading recipies from '" << path << "'";
  70. Framework::RCArray<ValidationResult> invalidParts;
  71. JSONValue* valid = validator->getValidParts(zJson, &invalidParts);
  72. for (ValidationResult* invalidPart : invalidParts)
  73. {
  74. Framework::Logging::error() << invalidPart->getInvalidInfo();
  75. }
  76. int count = 0;
  77. if (valid)
  78. {
  79. for (JSONValue* value : *valid->asArray())
  80. {
  81. Recipie* recipie
  82. = Game::INSTANCE->zTypeRegistry()->fromJson<Recipie>(
  83. value);
  84. if (recipie)
  85. {
  86. Framework::Text group = recipie->getGroupName();
  87. RecipieList* list = zRecipieList(group);
  88. if (!list)
  89. {
  90. registerRecipieList(group);
  91. list = zRecipieList(group);
  92. }
  93. list->addRecipie(recipie);
  94. count++;
  95. }
  96. }
  97. }
  98. Framework::Logging::info() << count << " recipies were loaded.";
  99. });
  100. schema = validator->getJsonSchema();
  101. syntaxFile.setDatei("data/syntax/schema/recipies.json");
  102. syntaxFile.erstellen();
  103. syntaxFile.open(Framework::Datei::Style::schreiben);
  104. syntaxFile.schreibe(schema->toString(), schema->toString().getLength());
  105. syntaxFile.close();
  106. schema->release();
  107. validator->release();
  108. for (RecipieList* list : lists)
  109. {
  110. bool found = 0;
  111. for (RecipieGroupConfig* groupConfig : groupConfigs)
  112. {
  113. if (list->getName().istGleich(groupConfig->getGroupName()))
  114. {
  115. found = 1;
  116. break;
  117. }
  118. }
  119. if (!found)
  120. {
  121. Framework::Logging::warning()
  122. << "Recipie list '" << list->getName()
  123. << "' has no group config. The recipies can not be viewed by "
  124. "the client.";
  125. }
  126. }
  127. }
  128. RecipieList* RecipieLoader::zRecipieList(const char* name) const
  129. {
  130. for (RecipieList* l : lists)
  131. {
  132. if (l->getName().istGleich(name)) return l;
  133. }
  134. return 0;
  135. }
  136. void RecipieLoader::registerRecipieList(const char* name)
  137. {
  138. if (zRecipieList(name))
  139. throw new std::invalid_argument("the recipie list already exists");
  140. lists.add(new RecipieList(name));
  141. }
  142. Framework::Text RecipieLoader::getCrafingUIML(int itemTypeId)
  143. {
  144. Framework::Text result = "<dialog id=\"crafting_";
  145. result.append() << itemTypeId << "\"><craftingRecipies>";
  146. for (RecipieList* list : lists)
  147. {
  148. Framework::RCArray<Recipie> recipies;
  149. list->findRecipies(itemTypeId, recipies);
  150. if (recipies.getEintragAnzahl() > 0)
  151. {
  152. for (RecipieGroupConfig* groupConfig : groupConfigs)
  153. {
  154. if (list->getName().istGleich(groupConfig->getGroupName()))
  155. {
  156. result.append() << "<craftingRecipieGroup name=\""
  157. << list->getName() << "\" itemIcon=\""
  158. << groupConfig->getIconItemType() << "\">";
  159. for (Recipie* recipie : recipies)
  160. {
  161. result += recipie->getRecipieUIML();
  162. }
  163. result += "</craftingRecipieGroup>";
  164. break;
  165. }
  166. }
  167. }
  168. }
  169. result += "</craftingRecipies></dialog>";
  170. return result;
  171. }