Advertisement
kirkarr

Untitled

Apr 28th, 2025
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.48 KB | None | 0 0
  1. local function makeNoise(seed)
  2.     -- Перемешиваем массив p на основе seed
  3.     local p = {}
  4.     for i = 0, 255 do
  5.         p[i + 1] = i
  6.     end
  7.     -- Fisher-Yates shuffle
  8.     math.randomseed(seed)
  9.     for i = 256, 2, -1 do
  10.         local j = math.random(1, i)
  11.         p[i], p[j] = p[j], p[i]
  12.     end
  13.     -- Дублируем для упрощения вычислений
  14.     for i = 0, 255 do
  15.         p[256 + i + 1] = p[i + 1]
  16.     end
  17.  
  18.     -- Вспомогательные функции
  19.     local function lerp(a, b, t)
  20.         return a + (b - a) * t
  21.     end
  22.  
  23.     local function fade(t)
  24.         return t * t * t * (t * (t * 6 - 15) + 10)
  25.     end
  26.  
  27.     local function grad(hash, x, y, z)
  28.         local h = hash % 16
  29.         local u = h < 8 and x or y
  30.         local v = h < 4 and y or (h == 12 or h == 14) and x or z
  31.         return ((h % 2) == 0 and u or -u) + ((h % 3) == 0 and v or -v)
  32.     end
  33.  
  34.     -- Основная функция шума
  35.     return function(x, y, z)
  36.         y = y or 0
  37.         z = z or 0
  38.  
  39.         local X = math.floor(x) % 256
  40.         local Y = math.floor(y) % 256
  41.         local Z = math.floor(z) % 256
  42.  
  43.         x = x - math.floor(x)
  44.         y = y - math.floor(y)
  45.         z = z - math.floor(z)
  46.  
  47.         local u = fade(x)
  48.         local v = fade(y)
  49.         local w = fade(z)
  50.  
  51.         local A  = p[X + 1] + Y
  52.         local AA = p[A + 1] + Z
  53.         local AB = p[A + 2] + Z
  54.         local B  = p[X + 2] + Y
  55.         local BA = p[B + 1] + Z
  56.         local BB = p[B + 2] + Z
  57.  
  58.         return lerp(
  59.             lerp(
  60.                 lerp(grad(p[AA + 1], x, y, z), grad(p[BA + 1], x - 1, y, z), u),
  61.                 lerp(grad(p[AB + 1], x, y - 1, z), grad(p[BB + 1], x - 1, y - 1, z), u),
  62.                 v
  63.             ),
  64.             lerp(
  65.                 lerp(grad(p[AA + 2], x, y, z - 1), grad(p[BA + 2], x - 1, y, z - 1), u),
  66.                 lerp(grad(p[AB + 2], x, y - 1, z - 1), grad(p[BB + 2], x - 1, y - 1, z - 1), u),
  67.                 v
  68.             ),
  69.             w
  70.         )
  71.     end
  72. end
  73.  
  74. function makeTerrainGenerator(seed)
  75.     local noise = makeNoise(seed)
  76.  
  77.     -- Мультиоктавный шум для более естественного рельефа
  78.     local function fractalNoise(x, z, octaves, persistence)
  79.         local total = 0
  80.         local frequency = 1
  81.         local amplitude = 1
  82.         local maxValue = 0
  83.  
  84.         for i = 1, octaves do
  85.             total = total + noise(x * frequency, z * frequency) * amplitude
  86.             maxValue = maxValue + amplitude
  87.             amplitude = amplitude * persistence
  88.             frequency = frequency * 2
  89.         end
  90.  
  91.         return total / maxValue
  92.     end
  93.  
  94.     -- Основная функция генерации высоты
  95.     return function(x, z)
  96.         -- Базовый шум (крупные формы рельефа)
  97.         local baseNoise = fractalNoise(x / 100, z / 100, 4, 0.5) * 64
  98.  
  99.         -- Детализация (холмы, неровности)
  100.         local detailNoise = fractalNoise(x / 20, z / 20, 2, 0.3) * 10
  101.  
  102.         -- Эрозия (сглаживание)
  103.         local erosion = fractalNoise(x / 50, z / 50, 2, 0.4) * 5
  104.  
  105.         -- Итоговая высота
  106.         local height = baseNoise + detailNoise - erosion
  107.  
  108.         -- Ограничиваем диапазон (например, от 50 до 120)
  109.         height = math.max(50, math.min(120, height))
  110.  
  111.         return math.floor(height)
  112.     end
  113. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement