miepzerino
2023-12-25 c6b7ce89c8d35af5fca62c1ddc97f4b1f5d31f86
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Tilemaps;
using UnityEngine.UIElements;
 
public class GenerateTileMap : MonoBehaviour
{
    public int? seed;
    public int maxWidth = 256;
    public int maxHeight = 384;
    public int maxGroundHeight = 256;
    private float scale;
    private float offsetX;
    private float offsetY;
    Tilemap tilemap;
    public RuleTile forestRuleTile;
    public TileBase borderTile;
    //public List<TileBase> tiles;
 
    private void Awake()
    {
        tilemap = GetComponent<Tilemap>();
#if DEBUG
        //seed = 0123456789;
#endif
        if (seed == null)
        {
            seed = GenerateSeed(9);
        }
 
        SetSettingsFromSeed(seed.Value);
    }
 
    public void SetSettingsFromSeed(int seed)
    {
        UnityEngine.Random.State randomState = UnityEngine.Random.state;
 
        UnityEngine.Random.InitState(seed);
        scale = UnityEngine.Random.Range(17f, 23f);
        offsetX = UnityEngine.Random.Range(-10000f, 10000f);
        offsetY = UnityEngine.Random.Range(-10000f, 10000f);
 
        UnityEngine.Random.state = randomState;
 
    }
 
    private int GenerateSeed(int size)
    {
        System.Random rand = new System.Random();
        string seedNumbers = "0123456789";
        char[] chars = new char[size];
        for (int i = 0; i < size; i++)
        {
            chars[i] = seedNumbers[rand.Next(seedNumbers.Length)];
        }
        return int.Parse(new string(chars));
    }
 
    public IEnumerator GenerateTiles(Action finishedCallback, List<Vector3Int> destroyedTiles)
    {
        for (int x = 1; x < maxWidth; x++)
        {
            for (int y = 1; y < maxGroundHeight; y++)
            {
                float xPerlin = ((float)x / maxWidth) * scale + offsetX;
                float yPerlin = ((float)y / maxHeight) * scale + offsetY;
                float perlinNoise = Mathf.PerlinNoise(xPerlin, yPerlin);
 
                if (perlinNoise >= 0.3f)
                {
                    if (!destroyedTiles.Contains(new Vector3Int(x, y, 0)))
                    {
                        tilemap.SetTile(new Vector3Int(x, y), forestRuleTile);
                    }
                }
 
            }
 
            // Update UI every 8 lines
            if ((x % 8) == 0)
            {
                yield return null;
            }
        }
        for (int x = 0; x <= maxWidth; x += maxWidth)
        {
            for (int y = 0; y <= maxHeight; y++)
            {
                tilemap.SetTile(new Vector3Int(x, y), borderTile);
            }
 
        }
        yield return null;
        for (int y = 0; y <= maxHeight; y += maxHeight)
        {
            for (int x = 1; x <= maxWidth; x++)
            {
                tilemap.SetTile(new Vector3Int(x, y), borderTile);
            }
 
        }
        yield return null;
        finishedCallback();
    }
}