d4552adc9ec0998725e663c47114e6836061ad2c..5e14cc355fd3a4a27a0196f504fee16d68f39612
2025-04-02 miepzerino
#41 fixed item description text
5e14cc diff | tree
2025-04-02 miepzerino
#41 changed ground layer to start at y=-1
7f1913 diff | tree
6 files modified
130 ■■■■■ changed files
Assets/Resources/Generateable/IronOre.prefab 5 ●●●●● patch | view | raw | blame | history
Assets/Resources/Generateable/IronOreHigh.prefab 4 ●●●● patch | view | raw | blame | history
Assets/Scenes/GameplayScene.unity 10 ●●●●● patch | view | raw | blame | history
Assets/Scripts/GenerateTileMap.cs 96 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Helpers/VectorHelper.cs 9 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Inventory/ItemUIScript.cs 6 ●●●●● patch | view | raw | blame | history
Assets/Resources/Generateable/IronOre.prefab
@@ -61,7 +61,6 @@
  m_EditorClassIdentifier: 
  isDropable: 1
  dropable: {fileID: 7215668260114684477, guid: ead8eea59ce41c244814a994365e1129, type: 3}
  dropAmount: 2
  dropRange: {x: 1, y: 1}
--- !u!114 &5943816882416256805
MonoBehaviour:
@@ -79,6 +78,6 @@
  weight: 7
  clusterWeight: 30
  minClusterSize: 8
  maxSpawnHeight: 250
  minSpawnHeight: 150
  maxSpawnHeight: 0
  minSpawnHeight: -50
  sprite: {fileID: 21300000, guid: 83ee72e0f385a7641b729c9f5c288e74, type: 3}
Assets/Resources/Generateable/IronOreHigh.prefab
@@ -78,6 +78,6 @@
  weight: 8
  clusterWeight: 25
  minClusterSize: 4
  maxSpawnHeight: 200
  minSpawnHeight: 100
  maxSpawnHeight: -50
  minSpawnHeight: -100
  sprite: {fileID: 21300000, guid: f2e947bf683bb8e419d65be7f14b0679, type: 3}
Assets/Scenes/GameplayScene.unity
@@ -697,7 +697,7 @@
  m_GameObject: {fileID: 519420028}
  serializedVersion: 2
  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
  m_LocalPosition: {x: 62, y: -22.89, z: -10}
  m_LocalPosition: {x: 0, y: 0, z: -10}
  m_LocalScale: {x: 1, y: 1, z: 1}
  m_ConstrainProportionsScale: 0
  m_Children: []
@@ -4197,7 +4197,7 @@
  m_GameObject: {fileID: 1624236510}
  serializedVersion: 2
  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
  m_LocalPosition: {x: 62, y: -22.89, z: -10}
  m_LocalPosition: {x: 0, y: 0, z: -10}
  m_LocalScale: {x: 1, y: 1, z: 1}
  m_ConstrainProportionsScale: 0
  m_Children:
@@ -4882,8 +4882,6 @@
  m_EditorClassIdentifier: 
  forestRuleTile: {fileID: 11400000, guid: 3999614e192b37546a6b710bf5ceb30c, type: 2}
  borderTile: {fileID: 11400000, guid: dcef846474e534b45ab3b175559c19a2, type: 2}
  generateables:
  - {fileID: 5943816882416256805, guid: 858e9987645c29748a5b0990923da82f, type: 3}
--- !u!1 &1955008394
GameObject:
  m_ObjectHideFlags: 0
@@ -5754,11 +5752,11 @@
      objectReference: {fileID: 0}
    - target: {fileID: 2368348636056148999, guid: c220ec455fce341408d66d880b464cad, type: 3}
      propertyPath: m_LocalPosition.x
      value: 62
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 2368348636056148999, guid: c220ec455fce341408d66d880b464cad, type: 3}
      propertyPath: m_LocalPosition.y
      value: -22.89
      value: 0
      objectReference: {fileID: 0}
    - target: {fileID: 2368348636056148999, guid: c220ec455fce341408d66d880b464cad, type: 3}
      propertyPath: m_LocalPosition.z
Assets/Scripts/GenerateTileMap.cs
@@ -34,15 +34,15 @@
{
    public int? seed;
    public static int maxWidth = 256;
    public static int maxHeight = 384;
    public static int maxGroundHeight = 256;
    public static int maxDepth = 384;
    public static int groundDepth = 256;
    private float scale;
    private float offsetX;
    private float offsetY;
    Tilemap tilemap;
    public CustomRuleTile forestRuleTile;
    public TileBase borderTile;
    public List<Generateable> generateables;
    private List<Generateable> generateables;
    //public List<TileBase> tiles;
    private void Awake()
@@ -58,7 +58,8 @@
        SetSettingsFromSeed(seed.Value);
        transform.position = new Vector3((maxWidth / 2) * -1, (maxGroundHeight + 1) * -1, transform.position.z);
        // Position adjusted to center horizontally, but align top at y=0
        transform.position = new Vector3((maxWidth / 2) * -1, -1, transform.position.z);
        LoadGenerateablesFromResources();
    }
@@ -120,12 +121,26 @@
    public IEnumerator GenerateTiles(Action finishedCallback, List<Vector3Int> destroyedTiles)
    {
        // generate ground
        yield return CreateGroundLayer(destroyedTiles);
        if (generateables != null)
        {
            yield return GenerateOreClusters(destroyedTiles);
        }
        // generate borders
        yield return GenerateBorders();
        finishedCallback();
    }
    private IEnumerator CreateGroundLayer(List<Vector3Int> destroyedTiles)
    {
        for (int x = 1; x < maxWidth; x++)
        {
            for (int y = 1; y < maxGroundHeight; y++)
            for (int y = -1; y > -groundDepth; y--)
            {
                float xPerlin = ((float)x / maxWidth) * scale + offsetX;
                float yPerlin = ((float)y / maxHeight) * scale + offsetY;
                float yPerlin = ((float)Mathf.Abs(y) / maxDepth) * scale + offsetY;
                float perlinNoise = Mathf.PerlinNoise(xPerlin, yPerlin);
                if (perlinNoise <= 0.7f)
@@ -145,66 +160,73 @@
                yield return null;
            }
        }
    }
        if (generateables != null)
    private IEnumerator GenerateOreClusters(List<Vector3Int> destroyedTiles)
    {
        foreach (Generateable generateable in generateables)
        {
            foreach (Generateable generateable in generateables)
            // Convert spawn heights to negative values if they aren't already
            int maxY = -Mathf.Abs(generateable.maxSpawnHeight);
            int minY = -Mathf.Abs(generateable.minSpawnHeight);
            Debug.Log($"Generating {generateable.name} between Y: {minY} - {maxY}");
            for (int x = 0; x < maxWidth; x++)
            {
                for (int x = 0; x < maxWidth; x++)
                for (int y = maxY; y > minY; y--)
                {
                    for (int y = generateable.minSpawnHeight; y < generateable.maxSpawnHeight; y++)
                    {
                        float xPerlin = ((float)x / maxWidth) * (float)generateable.clusterWeight + offsetX;
                        float yPerlin = ((float)y / maxHeight) * (float)generateable.clusterWeight + offsetY;
                        float perlinNoise = Mathf.PerlinNoise(xPerlin, yPerlin);
                    float xPerlin = ((float)x / maxWidth) * (float)generateable.clusterWeight + offsetX;
                    float yPerlin = ((float)Mathf.Abs(y) / maxDepth) * (float)generateable.clusterWeight + offsetY;
                    float perlinNoise = Mathf.PerlinNoise(xPerlin, yPerlin);
                        if (perlinNoise <= (1f / (float)generateable.weight))
                    if (perlinNoise <= (1f / (float)generateable.weight))
                    {
                        Vector3Int tileSpawnCoord = new Vector3Int(x, y);
                        if (!destroyedTiles.Contains(tileSpawnCoord) && tilemap.HasTile(tileSpawnCoord))
                        {
                            Vector3Int tileSpawnCoord = new Vector3Int(x, y);
                            if (!destroyedTiles.Contains(tileSpawnCoord) && tilemap.HasTile(tileSpawnCoord))
                            // Check potential cluster size before placing
                            int clusterSize = CountPotentialClusterSize(x, y, generateable.weight, generateable.clusterWeight);
                            if (clusterSize >= generateable.minClusterSize)
                            {
                                // Check potential cluster size before placing
                                int clusterSize = CountPotentialClusterSize(x, y, generateable.weight, generateable.clusterWeight);
                                if (clusterSize >= generateable.minClusterSize)
                                {
                                    tilemap.SetTile(tileSpawnCoord, generateable.tile);
                                }
                                //tilemap.SetTile(tileSpawnCoord, generateable.tile);
                                tilemap.SetTile(tileSpawnCoord, generateable.tile);
                            }
                            //tilemap.SetTile(tileSpawnCoord, generateable.tile);
                        }
                    }
                    // Update UI every 8 lines
                    if ((x % 8) == 0)
                    {
                        yield return null;
                    }
                }
                // Update UI every 8 lines
                if ((x % 8) == 0)
                {
                    yield return null;
                }
            }
        }
    }
        // generate borders
    private IEnumerator GenerateBorders()
    {
        // Vertical borders (going up from underground to sky)
        for (int x = 0; x <= maxWidth; x += maxWidth)
        {
            for (int y = 0; y <= maxHeight; y++)
            for (int y = -groundDepth; y <= maxDepth - groundDepth; y++)
            {
                tilemap.SetTile(new Vector3Int(x, y), borderTile);
            }
        }
        yield return null;
        for (int y = 0; y <= maxHeight; y += maxHeight)
        // Horizontal borders (at bottom and sky level)
        for (int y = -groundDepth; y <= maxDepth - groundDepth; y += maxDepth)
        {
            for (int x = 1; x <= maxWidth; x++)
            {
                tilemap.SetTile(new Vector3Int(x, y), borderTile);
            }
        }
        yield return null;
        finishedCallback();
    }
    private int CountPotentialClusterSize(int startX, int startY, int weight, int clusterWeight)
    {
        int size = 0;
@@ -230,7 +252,7 @@
                    if (checked_positions.Contains(neighbor)) continue;
                    float xPerlin = ((float)neighbor.x / maxWidth) * clusterWeight + offsetX;
                    float yPerlin = ((float)neighbor.y / maxHeight) * clusterWeight + offsetY;
                    float yPerlin = ((float)Mathf.Abs(neighbor.y) / maxDepth) * clusterWeight + offsetY;
                    float perlinNoise = Mathf.PerlinNoise(xPerlin, yPerlin);
                    if (perlinNoise <= (1f / (float)weight))
Assets/Scripts/Helpers/VectorHelper.cs
@@ -138,5 +138,14 @@
            }
            return result;
        }
        public static string ToRangeString(this Vector2 vector)
        {
            if (vector.x == vector.y)
            {
                return $"{vector.x}";
            }
            return $"{vector.x}-{vector.y}";
        }
    }
}
Assets/Scripts/Inventory/ItemUIScript.cs
@@ -42,10 +42,8 @@
                        description += $"\n<b>Generation</b>";
                        foreach (var variant in variants)
                        {
                            if (variant.maxHeight > 0 || variant.minHeight > 0)
                            {
                                description += $"\nSpawns between Y: {variant.minHeight} - {variant.maxHeight}. Amount: {variant.dropRange}";
                            }
                            description += $"\nLocation\tY: {variant.maxHeight} to {variant.minHeight}";
                            description += $"\n\tAmount: {variant.dropRange.ToRangeString()}";
                        }
                    }
                    gameObject.transform.Find("ItemTextDescription").GetComponent<TextMeshProUGUI>().text = description;