summaryrefslogtreecommitdiffstats
path: root/source/CraftingRecipes.h
diff options
context:
space:
mode:
Diffstat (limited to 'source/CraftingRecipes.h')
-rw-r--r--source/CraftingRecipes.h82
1 files changed, 82 insertions, 0 deletions
diff --git a/source/CraftingRecipes.h b/source/CraftingRecipes.h
new file mode 100644
index 000000000..bf85534b1
--- /dev/null
+++ b/source/CraftingRecipes.h
@@ -0,0 +1,82 @@
+
+// CraftingRecipes.h
+
+// Interfaces to the cCraftingRecipes class representing the storage of crafting recipes
+
+
+
+
+#pragma once
+
+#include "cItem.h"
+
+
+
+
+
+class cCraftingRecipes
+{
+public:
+ static const int MAX_GRID_WIDTH = 3;
+ static const int MAX_GRID_HEIGHT = 3;
+
+ cCraftingRecipes(void);
+ ~cCraftingRecipes();
+
+ /// Offers an item resulting from the crafting grid setup. Doesn't modify the grid
+ cItem Offer(const cItem * a_CraftingGrid, int a_GridWidth, int a_GridHeight);
+
+ /// Crafts the item resulting from the crafting grid setup. Modifies the grid, returns the crafted item
+ cItem Craft(cItem * a_CraftingGrid, int a_GridWidth, int a_GridHeight);
+
+protected:
+
+ struct cRecipeSlot
+ {
+ cItem m_Item;
+ int x, y; // 1..3, or -1 for "any"
+ } ;
+ typedef std::vector<cRecipeSlot> cRecipeSlots;
+
+ // A single recipe, stored. Each recipe is normalized right after parsing (NormalizeIngredients())
+ struct cRecipe
+ {
+ cRecipeSlots m_Ingredients;
+ cItem m_Result;
+
+ // Size of the regular items in the recipe; "anywhere" items are excluded:
+ int m_Width;
+ int m_Height;
+ } ;
+ typedef std::vector<cRecipe *> cRecipes;
+
+ cRecipes m_Recipes;
+
+ void LoadRecipes(void);
+ void ClearRecipes(void);
+
+ /// Parses the recipe line and adds it into m_Recipes. a_LineNum is used for diagnostic warnings only
+ void AddRecipeLine(int a_LineNum, const AString & a_RecipeLine);
+
+ /// Parses an item string in the format "<ItemType>[^<Damage>]", returns true if successful.
+ bool ParseItem(const AString & a_String, cItem & a_Item);
+
+ /// Parses one ingredient and adds it to the specified recipe. Returns true if successful.
+ bool ParseIngredient(const AString & a_String, cRecipe * a_Recipe);
+
+ /// Moves the recipe to top-left corner, sets its MinWidth / MinHeight
+ void NormalizeIngredients(cRecipe * a_Recipe);
+
+ /// Finds a recipe matching the crafting grid. Returns a newly allocated recipe (with all its coords set) or NULL if not found. Caller must delete return value!
+ cRecipe * FindRecipe(const cItem * a_CraftingGrid, int a_GridWidth, int a_GridHeight);
+
+ /// Same as FindRecipe, but the grid is guaranteed to be of minimal dimensions needed
+ cRecipe * FindRecipeCropped(const cItem * a_CraftingGrid, int a_GridWidth, int a_GridHeight, int a_GridStride);
+
+ /// Checks if the grid matches the specified recipe, offset by the specified offsets. Returns a matched cRecipe * if so, or NULL if not matching. Caller must delete the return value!
+ cRecipe * MatchRecipe(const cItem * a_CraftingGrid, int a_GridWidth, int a_GridHeight, int a_GridStride, const cRecipe * a_Recipe, int a_OffsetX, int a_OffsetY);
+} ;
+
+
+
+