49 lines
2.1 KiB
Python
49 lines
2.1 KiB
Python
import numpy as np
|
|
import random
|
|
from settings import WorldSettings
|
|
|
|
class ArtisticClimateGenerator:
|
|
def __init__(self, height_map: np.ndarray, settings: WorldSettings):
|
|
self.height_map = height_map
|
|
self.settings = settings
|
|
random.seed(settings.get_valid_seed())
|
|
|
|
# Оригинальные цвета из ClimateGenerator
|
|
self.biome_colors = {
|
|
'water': (0.2, 0.4, 0.8, 1.0),
|
|
'ice': (0.95, 0.95, 0.98, 0.8),
|
|
'tundra': (0.4, 0.6, 0.9, 0.9),
|
|
'taiga': (0.1, 0.3, 0.15, 1.0),
|
|
'forest': (0.3, 0.6, 0.3, 1.0),
|
|
'desert': (0.9, 0.6, 0.2, 1.0),
|
|
'steppe': (0.8, 0.75, 0.5, 1.0),
|
|
'swamp': (0.4, 0.35, 0.2, 0.9),
|
|
'jungle': (0.1, 0.5, 0.1, 1.0),
|
|
'savanna': (0.8, 0.7, 0.3, 1.0)
|
|
}
|
|
|
|
def generate_biome_map(self, enabled_biomes=None) -> np.ndarray:
|
|
"""Полностью случайное распределение биомов"""
|
|
if enabled_biomes is None:
|
|
enabled_biomes = list(self.biome_colors.keys())
|
|
|
|
height, width = self.height_map.shape
|
|
biome_map = np.zeros((height, width, 4), dtype=np.float32)
|
|
|
|
# Включаем воду, если она есть в списке
|
|
water_included = 'water' in enabled_biomes
|
|
water_level = 0.05
|
|
|
|
for y in range(height):
|
|
for x in range(width):
|
|
# Если это вода - рисуем воду и переходим к следующей точке
|
|
if water_included and self.height_map[y,x] < water_level:
|
|
biome_map[y,x] = self.biome_colors['water']
|
|
continue
|
|
|
|
# Случайный выбор любого биома
|
|
available_biomes = [b for b in enabled_biomes if b != 'water'] or ['forest']
|
|
random_biome = random.choice(available_biomes)
|
|
biome_map[y,x] = self.biome_colors[random_biome]
|
|
|
|
return biome_map |