project/climate_zones_artistic.py

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