From d4552adc9ec0998725e663c47114e6836061ad2c Mon Sep 17 00:00:00 2001
From: miepzerino <o.skotnik@gmail.com>
Date: Wed, 02 Apr 2025 14:52:46 +0000
Subject: [PATCH] #35 reworked ore generation

---
 Assets/Scripts/Cache/GenerateableDatabase.cs |   96 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 96 insertions(+), 0 deletions(-)

diff --git a/Assets/Scripts/Cache/GenerateableDatabase.cs b/Assets/Scripts/Cache/GenerateableDatabase.cs
new file mode 100644
index 0000000..f556a80
--- /dev/null
+++ b/Assets/Scripts/Cache/GenerateableDatabase.cs
@@ -0,0 +1,96 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+public class GenerateableDatabase : MonoBehaviour
+{
+    public static GenerateableDatabase Instance { get; private set; }
+    private Dictionary<int, List<(int minClusterSize, int maxHeight, int minHeight, Vector2 dropRange)>> generateableDict
+        = new Dictionary<int, List<(int, int, int, Vector2 dropRange)>>();
+
+    private void Awake()
+    {
+        if (Instance == null)
+        {
+            Instance = this;
+        }
+        else
+        {
+            Destroy(gameObject);
+        }
+    }
+
+    public void InitializeFromGenerateables(List<Generateable> generateables)
+    {
+        generateableDict.Clear();
+
+        foreach (Generateable generateable in generateables)
+        {
+            Dropable dropable = generateable.GetComponent<Dropable>();
+
+            if (dropable != null && dropable.dropable != null)
+            {
+                int itemId = dropable.dropable.itemId;
+
+                if (!generateableDict.ContainsKey(itemId))
+                {
+                    generateableDict[itemId] = new List<(int, int, int, Vector2 dropRange)>();
+                }
+
+                generateableDict[itemId].Add((
+                    generateable.minClusterSize,
+                    generateable.maxSpawnHeight,
+                    generateable.minSpawnHeight,
+                    dropable.dropRange
+                ));
+            }
+        }
+
+        if (generateableDict.Count == 0)
+        {
+            Debug.LogWarning("No valid generateables found with dropable items");
+        }
+    }
+
+    public bool TryGetGenerateables(int itemId,
+        out List<(int minClusterSize, int maxHeight, int minHeight, Vector2 dropRange)> generateables)
+    {
+        if (generateableDict.TryGetValue(itemId, out generateables))
+        {
+            return true;
+        }
+
+        generateables = null;
+        return false;
+    }
+
+    // Optional: Helper method to get ranges across all variants
+    public bool TryGetGenerateableRanges(int itemId,
+        out int minClusterSize, out int maxHeight, out int minHeight)
+    {
+        if (generateableDict.TryGetValue(itemId, out var variants))
+        {
+            minClusterSize = int.MaxValue;
+            maxHeight = int.MinValue;
+            minHeight = int.MaxValue;
+
+            foreach (var variant in variants)
+            {
+                minClusterSize = Mathf.Min(minClusterSize, variant.minClusterSize);
+                maxHeight = Mathf.Max(maxHeight, variant.maxHeight);
+                minHeight = Mathf.Min(minHeight, variant.minHeight);
+            }
+
+            return true;
+        }
+
+        minClusterSize = 0;
+        maxHeight = 0;
+        minHeight = 0;
+        return false;
+    }
+
+    public IEnumerable<int> GetAllGenerateableIds()
+    {
+        return generateableDict.Keys;
+    }
+}
\ No newline at end of file

--
Gitblit v1.9.3