using MrGameEng.WorldGen;

namespace LittleSim.Sim;

/// <summary>
/// Игровой адаптер процедурной генерации: превращает параметры мира в настройки движкового
/// <see cref="HeightmapGenerator"/> (шум Перлина → fBm → island-маска) и отдаёт нормализованную
/// карту высот. Один и тот же сид всегда даёт один и тот же мир — фундамент воспроизводимой
/// симуляции. Классификация высот в типы клеток живёт в дефах (<see cref="Content.TerrainSet"/>).
/// </summary>
public static class WorldGenerator
{
    /// <summary>
    /// Строит нормализованную карту высот <paramref name="width"/>×<paramref name="height"/> из
    /// <paramref name="seed"/>. <paramref name="detail"/> (1..8, из меню «масштаб деталей»/сейва)
    /// задаёт размер «континентов»: больше — крупнее и плавнее суша (ниже частота шума).
    /// </summary>
    public static Heightmap Generate(int width, int height, int seed, int detail = 4)
    {
        var scale = Math.Clamp(detail, 1, 8);
        var settings = new HeightmapSettings
        {
            Seed = seed,
            Frequency = 6f / scale, // больше «масштаба деталей» → ниже частота → крупнее континенты
            Octaves = 5,
            Persistence = 0.5f,
            Lacunarity = 2f,
            IslandStrength = 0.55f, // края мира уходят под воду — мир выглядит как континент
            IslandPower = 3f,
        };
        return new HeightmapGenerator(settings).Generate(width, height);
    }
}
