From 673e1c63f1801f6115215bb7695ace352ab86737 Mon Sep 17 00:00:00 2001
From: jzitnik-dev <email@jzitnik.dev>
Date: Sun, 2 Mar 2025 15:45:21 +0100
Subject: [PATCH] feat: Added regex support in crafting recipe

---
 .../game/annotations/CraftingRecipeRegistry.java     |  1 +
 .../cz/jzitnik/game/crafting/CraftingRecipe.java     |  1 +
 .../cz/jzitnik/game/crafting/CraftingRecipeList.java | 12 ++++++------
 .../cz/jzitnik/game/crafting/recipes/BedRecipe.java  |  7 ++++---
 4 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/src/main/java/cz/jzitnik/game/annotations/CraftingRecipeRegistry.java b/src/main/java/cz/jzitnik/game/annotations/CraftingRecipeRegistry.java
index 04506eb..07a56bf 100644
--- a/src/main/java/cz/jzitnik/game/annotations/CraftingRecipeRegistry.java
+++ b/src/main/java/cz/jzitnik/game/annotations/CraftingRecipeRegistry.java
@@ -8,4 +8,5 @@ public @interface CraftingRecipeRegistry {
     String[] recipe();
     String result();
     int amount();
+    boolean usingRegex() default false;
 }
diff --git a/src/main/java/cz/jzitnik/game/crafting/CraftingRecipe.java b/src/main/java/cz/jzitnik/game/crafting/CraftingRecipe.java
index 39d138f..2b90fad 100644
--- a/src/main/java/cz/jzitnik/game/crafting/CraftingRecipe.java
+++ b/src/main/java/cz/jzitnik/game/crafting/CraftingRecipe.java
@@ -11,4 +11,5 @@ import java.util.function.Supplier;
 public class CraftingRecipe {
     private String[][] recipe;
     private Supplier<InventoryItem> itemSupplier;
+    private boolean usingRegex;
 }
diff --git a/src/main/java/cz/jzitnik/game/crafting/CraftingRecipeList.java b/src/main/java/cz/jzitnik/game/crafting/CraftingRecipeList.java
index bf604f9..807a367 100644
--- a/src/main/java/cz/jzitnik/game/crafting/CraftingRecipeList.java
+++ b/src/main/java/cz/jzitnik/game/crafting/CraftingRecipeList.java
@@ -24,7 +24,7 @@ public class CraftingRecipeList {
                 String[][] recipeGrid = convertTo2DGrid(annotation.recipe());
 
                 recipes.add(new CraftingRecipe(recipeGrid,
-                        () -> new InventoryItem(annotation.amount(), ItemBlockSupplier.getItem(annotation.result()))));
+                        () -> new InventoryItem(annotation.amount(), ItemBlockSupplier.getItem(annotation.result())), annotation.usingRegex()));
             } catch (Exception e) {
                 e.printStackTrace();
             }
@@ -53,7 +53,7 @@ public class CraftingRecipeList {
 
     public static Optional<CraftingRecipe> getRecipe(String[] r) {
         for (CraftingRecipe recipe : recipes) {
-            if (matchesByItemSet(recipe.getRecipe(), r)) {
+            if (matchesByItemSet(recipe.getRecipe(), r, recipe.isUsingRegex())) {
                 return Optional.of(recipe);
             }
         }
@@ -90,7 +90,7 @@ public class CraftingRecipeList {
         return trimmedArray;
     }
 
-    public static boolean are2DArraysIdentical(String[][] array1, String[][] array2) {
+    public static boolean are2DArraysIdentical(String[][] array1, String[][] array2, boolean usingRegex) {
         if (array1.length != array2.length) {
             return false;
         }
@@ -104,7 +104,7 @@ public class CraftingRecipeList {
                 if (array1[i][j] == null && array2[i][j] != null) {
                     return false;
                 }
-                if (array1[i][j] != null && !array1[i][j].equals(array2[i][j])) {
+                if (array1[i][j] != null && (usingRegex ? !array2[i][j].matches(array1[i][j]) : !array1[i][j].equals(array2[i][j])) ) {
                     return false;
                 }
             }
@@ -113,7 +113,7 @@ public class CraftingRecipeList {
         return true;
     }
 
-    private static boolean matchesByItemSet(String[][] recipe, String[] grid) {
+    private static boolean matchesByItemSet(String[][] recipe, String[] grid, boolean usingRegex) {
         String[][] finalGrid = new String[3][3];
 
         if (grid.length == 4) {
@@ -136,6 +136,6 @@ public class CraftingRecipeList {
         var croppedRecipe = trimNullEdges(recipe);
         var croppedGrid = trimNullEdges(finalGrid);
 
-        return are2DArraysIdentical(croppedRecipe, croppedGrid);
+        return are2DArraysIdentical(croppedRecipe, croppedGrid, usingRegex);
     }
 }
diff --git a/src/main/java/cz/jzitnik/game/crafting/recipes/BedRecipe.java b/src/main/java/cz/jzitnik/game/crafting/recipes/BedRecipe.java
index 3b7c4ee..61c4591 100644
--- a/src/main/java/cz/jzitnik/game/crafting/recipes/BedRecipe.java
+++ b/src/main/java/cz/jzitnik/game/crafting/recipes/BedRecipe.java
@@ -4,11 +4,12 @@ import cz.jzitnik.game.annotations.CraftingRecipeRegistry;
 
 @CraftingRecipeRegistry(
         recipe = {
-                "dirt", "_", "_",
-                "_", "_", "_",
+                "^.*_wool$", "^.*_wool$", "^.*_wool$",
+                "oak_planks", "oak_planks", "oak_planks",
                 "_", "_", "_"
         },
         result = "bed",
-        amount = 1
+        amount = 1,
+        usingRegex = true
 )
 public class BedRecipe {}