Recipie.h 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. #pragma once
  2. #include <Array.h>
  3. #include <JSON.h>
  4. #include "ItemFilter.h"
  5. #include "ItemModifier.h"
  6. #include "TypeRegistry.h"
  7. class CraftingStorage;
  8. class ShapedCraftingStorage;
  9. struct ItemInfo
  10. {
  11. int type;
  12. int count;
  13. float hp;
  14. float maxHp;
  15. float durability;
  16. float maxDurability;
  17. };
  18. class RecipieInput : public Framework::ReferenceCounter
  19. {
  20. private:
  21. ItemFilter* filter;
  22. ItemModifier* modifier;
  23. int amount;
  24. public:
  25. RecipieInput();
  26. ~RecipieInput();
  27. void setFilter(ItemFilter* filter);
  28. ItemFilter* zFilter() const;
  29. void setModifier(ItemModifier* modifier);
  30. ItemModifier* zModifier() const;
  31. void setAmount(int amount);
  32. int getAmount() const;
  33. };
  34. class RecipieInputFactory : public ObjectTypeFactory<RecipieInput>
  35. {
  36. public:
  37. RecipieInputFactory();
  38. RecipieInput* fromJson(Framework::JSON::JSONObject* zJson) const override;
  39. Framework::JSON::JSONObject* toJsonObject(
  40. RecipieInput* zObject) const override;
  41. JSONObjectValidationBuilder* addToValidator(
  42. JSONObjectValidationBuilder* builder) const override;
  43. };
  44. class RecipieOutput : public Framework::ReferenceCounter
  45. {
  46. private:
  47. int itemTypeId;
  48. int amount;
  49. ItemModifier* modifier;
  50. public:
  51. RecipieOutput();
  52. ~RecipieOutput();
  53. void setItemTypeId(int itemTypeId);
  54. int getItemTypeId() const;
  55. void setAmount(int amount);
  56. int getAmount() const;
  57. void setModifier(ItemModifier* modifier);
  58. ItemModifier* zModifier() const;
  59. Item* createItem() const;
  60. };
  61. class RecipieOutputFactory : public ObjectTypeFactory<RecipieOutput>
  62. {
  63. public:
  64. RecipieOutputFactory();
  65. RecipieOutput* fromJson(Framework::JSON::JSONObject* zJson) const override;
  66. Framework::JSON::JSONObject* toJsonObject(
  67. RecipieOutput* zObject) const override;
  68. JSONObjectValidationBuilder* addToValidator(
  69. JSONObjectValidationBuilder* builder) const override;
  70. };
  71. class Recipie : public virtual Framework::ReferenceCounter
  72. {
  73. protected:
  74. Framework::Text groupName;
  75. Framework::RCArray<RecipieOutput> outputs;
  76. public:
  77. Recipie();
  78. virtual bool testApplicability(CraftingStorage* zStorage) = 0;
  79. virtual void consumeInputs(CraftingStorage* zStorage) = 0;
  80. virtual void produceOutputs(CraftingStorage* zStorage) = 0;
  81. virtual void apply(CraftingStorage* zStorage);
  82. virtual Framework::Text getRecipieUIML() = 0;
  83. void addOutput(RecipieOutput* outputs);
  84. virtual Framework::Array<ItemInfo> getOutput() const;
  85. bool createsOutput(int itemTypeId);
  86. void setGroupName(Framework::Text groupName);
  87. const Framework::RCArray<RecipieOutput>& getOutputs() const;
  88. Framework::Text getGroupName() const;
  89. virtual int getTicksNeeded() const;
  90. virtual int getFuelPerTickNeeded() const;
  91. };
  92. template<typename S> class RecipieFactory : public SubTypeFactory<Recipie, S>
  93. {
  94. public:
  95. RecipieFactory()
  96. : SubTypeFactory<Recipie, S>()
  97. {}
  98. S* fromJson(Framework::JSON::JSONObject* zJson) const override
  99. {
  100. S* result = createValue(zJson);
  101. Recipie* zRecipie = dynamic_cast<Recipie*>(result);
  102. for (Framework::JSON::JSONValue* output :
  103. *zJson->zValue("outputs")->asArray())
  104. {
  105. zRecipie->addOutput(
  106. Game::INSTANCE->zTypeRegistry()->fromJson<RecipieOutput>(
  107. output));
  108. }
  109. zRecipie->setGroupName(zJson->zValue("group")->asString()->getString());
  110. return result;
  111. }
  112. Framework::JSON::JSONObject* toJsonObject(S* zObject) const override
  113. {
  114. Framework::JSON::JSONObject* result = new Framework::JSON::JSONObject();
  115. Recipie* zRecipie = dynamic_cast<Recipie*>(result);
  116. Framework::JSON::JSONArray* outputs = new Framework::JSON::JSONArray();
  117. for (RecipieOutput* output : zRecipie->getOutputs())
  118. {
  119. outputs->addValue(Game::INSTANCE->zTypeRegistry()->toJson(output));
  120. }
  121. result->addValue("outputs", outputs);
  122. result->addValue(
  123. "group", new Framework::JSON::JSONString(zRecipie->getGroupName()));
  124. return result;
  125. };
  126. JSONObjectValidationBuilder* addToValidator(
  127. JSONObjectValidationBuilder* builder) const override
  128. {
  129. return builder->withRequiredArray("outputs")
  130. ->addAcceptedTypeInArray(
  131. Game::INSTANCE->zTypeRegistry()->getValidator<RecipieOutput>())
  132. ->finishArray()
  133. ->withRequiredString("group")
  134. ->finishString();
  135. }
  136. protected:
  137. virtual S* createValue(Framework::JSON::JSONObject* zJson) const = 0;
  138. };
  139. class UnshapedRecipie : public Recipie
  140. {
  141. private:
  142. Framework::RCArray<RecipieInput> inputs;
  143. public:
  144. UnshapedRecipie();
  145. bool testApplicability(CraftingStorage* zStorage) override;
  146. void consumeInputs(CraftingStorage* zStorage) override;
  147. void produceOutputs(CraftingStorage* zStorage) override;
  148. Framework::Text getRecipieUIML() override;
  149. void addInput(RecipieInput* input);
  150. const Framework::RCArray<RecipieInput>& getInputs() const;
  151. };
  152. template<class T,
  153. typename = std::enable_if<std::is_base_of<UnshapedRecipie, T>::value>>
  154. class UnshapedRecipieFactory : public RecipieFactory<T>
  155. {
  156. public:
  157. UnshapedRecipieFactory()
  158. : RecipieFactory<T>()
  159. {}
  160. T* createValue(Framework::JSON::JSONObject* zJson) const override
  161. {
  162. return (T*)new UnshapedRecipie();
  163. }
  164. T* fromJson(Framework::JSON::JSONObject* zJson) const override
  165. {
  166. UnshapedRecipie* result = dynamic_cast<UnshapedRecipie*>(
  167. RecipieFactory<T>::fromJson(zJson));
  168. for (Framework::JSON::JSONValue* input :
  169. *zJson->zValue("inputs")->asArray())
  170. {
  171. result->addInput(
  172. Game::INSTANCE->zTypeRegistry()->fromJson<RecipieInput>(input));
  173. }
  174. return dynamic_cast<T*>(result);
  175. }
  176. Framework::JSON::JSONObject* toJsonObject(T* zObject) const override
  177. {
  178. Framework::JSON::JSONObject* result
  179. = RecipieFactory<T>::toJsonObject(zObject);
  180. Framework::JSON::JSONArray* inputs = new Framework::JSON::JSONArray();
  181. for (RecipieInput* input : zObject->getInputs())
  182. {
  183. inputs->addValue(Game::INSTANCE->zTypeRegistry()->toJson(input));
  184. }
  185. result->addValue("inputs", inputs);
  186. return result;
  187. }
  188. JSONObjectValidationBuilder* addToValidator(
  189. JSONObjectValidationBuilder* builder) const override
  190. {
  191. return RecipieFactory<T>::addToValidator(
  192. builder->withRequiredArray("inputs")
  193. ->addAcceptedTypeInArray(Game::INSTANCE->zTypeRegistry()
  194. ->getValidator<RecipieInput>())
  195. ->finishArray());
  196. }
  197. const char* getTypeToken() const override
  198. {
  199. return "unshaped";
  200. }
  201. };
  202. class ShapedRecipie : public Recipie
  203. {
  204. private:
  205. Framework::RCArray<RecipieInput> inputs;
  206. int width;
  207. int height;
  208. public:
  209. ShapedRecipie();
  210. bool testApplicability(CraftingStorage* zStorage) override;
  211. void consumeInputs(CraftingStorage* zStorage) override;
  212. void produceOutputs(CraftingStorage* zStorage) override;
  213. Framework::Text getRecipieUIML() override;
  214. void setWidth(int width);
  215. int getWidth() const;
  216. void setHeight(int height);
  217. int getHeight() const;
  218. void addInput(RecipieInput* input);
  219. void setInput(int index, RecipieInput* input);
  220. const Framework::RCArray<RecipieInput>& getInputs() const;
  221. };
  222. class ShapedRecipieFactory : public RecipieFactory<ShapedRecipie>
  223. {
  224. public:
  225. ShapedRecipieFactory();
  226. ShapedRecipie* createValue(
  227. Framework::JSON::JSONObject* zJson) const override;
  228. ShapedRecipie* fromJson(Framework::JSON::JSONObject* zJson) const override;
  229. Framework::JSON::JSONObject* toJsonObject(
  230. ShapedRecipie* zObject) const override;
  231. JSONObjectValidationBuilder* addToValidator(
  232. JSONObjectValidationBuilder* builder) const override;
  233. const char* getTypeToken() const override;
  234. };
  235. class MachineRecipie : public UnshapedRecipie
  236. {
  237. private:
  238. int neededTicks;
  239. int neededFuelPerTick;
  240. public:
  241. MachineRecipie();
  242. void setTicksNeeded(int ticks);
  243. virtual int getTicksNeeded() const override;
  244. void setFuelPerTickNeeded(int fuel);
  245. virtual int getFuelPerTickNeeded() const override;
  246. };
  247. class MachineRecipieFactory : public UnshapedRecipieFactory<MachineRecipie>
  248. {
  249. public:
  250. MachineRecipieFactory();
  251. MachineRecipie* createValue(
  252. Framework::JSON::JSONObject* zJson) const override;
  253. MachineRecipie* fromJson(Framework::JSON::JSONObject* zJson) const override;
  254. Framework::JSON::JSONObject* toJsonObject(
  255. MachineRecipie* zObject) const override;
  256. JSONObjectValidationBuilder* addToValidator(
  257. JSONObjectValidationBuilder* builder) const override;
  258. const char* getTypeToken() const override;
  259. };