def __init__(self, width, height, erosion_factor=0.01, max_erosion_alt=0.9, sedimentation_factor=0.01, mudslide_coef=0.4, seed=None): self.width = width self.height = height self._hm = new_heightmap(width, height) # World Heightmap self._hm2 = new_heightmap(width, height) # World map without erosion self._precipitation = new_heightmap(width, height) self._hm_temperature = new_heightmap(width, height) self._biome_map = np.zeros((width, height)) self.cloud_dx, self.cloud_tot_dx = 0.0, 0.0 self._clouds = np.zeros((height, width)) self.random = random.Random(seed) # Random number generator self.erosion_factor = erosion_factor self.max_erosion_alt = max_erosion_alt self.sedimentation_factor = sedimentation_factor self.mudslide_coef = mudslide_coef self.noise = tcod.noise_new(2) # noise.NoiseGenerator(2) # map_data = [MapData() for _ in range(height * width) ] #np.full((width, height),dtype=MapData) self.map_data = np.array(map_data) self.map_data.shape = (height, width)
def test_noise(): noise = libtcodpy.noise_new(1) libtcodpy.noise_set_type(noise, libtcodpy.NOISE_SIMPLEX) libtcodpy.noise_get(noise, [0]) libtcodpy.noise_get_fbm(noise, [0], 4) libtcodpy.noise_get_turbulence(noise, [0], 4) libtcodpy.noise_delete(noise)
def drainage(self): drainage_hm = heightmap_new(self.width, self.height, order="C") drainage_hm[:] += 2 drainage_noise = tcod.noise_new(2, tcod.NOISE_DEFAULT_HURST, tcod.NOISE_DEFAULT_LACUNARITY) heightmap_add_fbm(drainage_hm, drainage_noise, 2, 2, 0, 0, 32, 1, 1) heightmap_normalize(drainage_hm, 0.0, 1.0) self.world_data["drainage"] = drainage_hm
def precipitation(self): precipitation_hm = heightmap_new(self.width, self.height, order="C") precipitation_hm[:] += 2 precipitation_noise = tcod.noise_new(2, tcod.NOISE_DEFAULT_HURST, tcod.NOISE_DEFAULT_LACUNARITY) heightmap_add_fbm(precipitation_hm, precipitation_noise, 2, 2, 0, 0, 32, 1, 1) heightmap_normalize(precipitation_hm, 0.0, 1.0) self.world_data["precipitation"] = precipitation_hm
def precipitation(precip_heightmap, temp_heightmap): precip_heightmap[:] += 2 for x in range(WORLD_WIDTH): for y in range(WORLD_HEIGHT): temp = tcod.heightmap_get_value(temp_heightmap, x, y) precipitation = tcod.noise_new(2, tcod.NOISE_DEFAULT_HURST, tcod.NOISE_DEFAULT_LACUNARITY) tcod.heightmap_add_fbm(precip_heightmap, precipitation, 2, 2, 0, 0, 32, 1, 1) tcod.heightmap_normalize(precip_heightmap, 0.0, 1.0) return precip_heightmap, temp_heightmap
def Percipitaion(preciphm, temphm): tcod.heightmap_add(preciphm, 2) for x in range(WORLD_WIDTH): for y in range(WORLD_HEIGHT): temp = tcod.heightmap_get_value(temphm, x, y) precip = tcod.noise_new(2, tcod.NOISE_DEFAULT_HURST, tcod.NOISE_DEFAULT_LACUNARITY) # tcod.heightmap_add_fbm(preciphm,precip ,2, 2, 0, 0, 32, 1, 1) tcod.heightmap_normalize(preciphm, 0.0, 1.0)
def __init__(self, width, height): self.width = width self.height = height self.console = tcod.console_new(self.width, self.height) self.elevation = tcod.heightmap_new(self.width, self.height) self.map = tcod.map_new(self.width, self.height) # put some interesting values into elevation noise = tcod.noise_new(2,tcod.NOISE_DEFAULT_HURST, tcod.NOISE_DEFAULT_LACUNARITY, 0) for x in range (0, self.width): for y in range (0, self.height): k = 3.4 value = tcod.noise_get(noise,[x/k,y/k], tcod.NOISE_PERLIN) tcod.heightmap_set_value(self.elevation, x, y, value) tcod.noise_delete(noise) self.update()
def test_heightmap(): hmap = libtcodpy.heightmap_new(16, 16) repr(hmap) noise = libtcodpy.noise_new(2) # basic operations libtcodpy.heightmap_set_value(hmap, 0, 0, 1) libtcodpy.heightmap_add(hmap, 1) libtcodpy.heightmap_scale(hmap, 1) libtcodpy.heightmap_clear(hmap) libtcodpy.heightmap_clamp(hmap, 0, 0) libtcodpy.heightmap_copy(hmap, hmap) libtcodpy.heightmap_normalize(hmap) libtcodpy.heightmap_lerp_hm(hmap, hmap, hmap, 0) libtcodpy.heightmap_add_hm(hmap, hmap, hmap) libtcodpy.heightmap_multiply_hm(hmap, hmap, hmap) # modifying the heightmap libtcodpy.heightmap_add_hill(hmap, 0, 0, 4, 1) libtcodpy.heightmap_dig_hill(hmap, 0, 0, 4, 1) libtcodpy.heightmap_rain_erosion(hmap, 1, 1, 1) libtcodpy.heightmap_kernel_transform(hmap, 3, [-1, 1, 0], [0, 0, 0], [.33, .33, .33], 0, 1) libtcodpy.heightmap_add_voronoi(hmap, 10, 3, [1,3,5]) libtcodpy.heightmap_add_fbm(hmap, noise, 1, 1, 1, 1, 4, 1, 1) libtcodpy.heightmap_scale_fbm(hmap, noise, 1, 1, 1, 1, 4, 1, 1) libtcodpy.heightmap_dig_bezier(hmap, [0, 16, 16, 0], [0, 0, 16, 16], 1, 1, 1, 1) # read data libtcodpy.heightmap_get_value(hmap, 0, 0) libtcodpy.heightmap_get_interpolated_value(hmap, 0, 0) libtcodpy.heightmap_get_slope(hmap, 0, 0) libtcodpy.heightmap_get_normal(hmap, 0, 0, 0) libtcodpy.heightmap_count_cells(hmap, 0, 0) libtcodpy.heightmap_has_land_on_border(hmap, 0) libtcodpy.heightmap_get_minmax(hmap) libtcodpy.noise_delete(noise) libtcodpy.heightmap_delete(hmap)
def test_heightmap(): hmap = libtcodpy.heightmap_new(16, 16) repr(hmap) noise = libtcodpy.noise_new(2) # basic operations libtcodpy.heightmap_set_value(hmap, 0, 0, 1) libtcodpy.heightmap_add(hmap, 1) libtcodpy.heightmap_scale(hmap, 1) libtcodpy.heightmap_clear(hmap) libtcodpy.heightmap_clamp(hmap, 0, 0) libtcodpy.heightmap_copy(hmap, hmap) libtcodpy.heightmap_normalize(hmap) libtcodpy.heightmap_lerp_hm(hmap, hmap, hmap, 0) libtcodpy.heightmap_add_hm(hmap, hmap, hmap) libtcodpy.heightmap_multiply_hm(hmap, hmap, hmap) # modifying the heightmap libtcodpy.heightmap_add_hill(hmap, 0, 0, 4, 1) libtcodpy.heightmap_dig_hill(hmap, 0, 0, 4, 1) libtcodpy.heightmap_rain_erosion(hmap, 1, 1, 1) libtcodpy.heightmap_kernel_transform(hmap, 3, [-1, 1, 0], [0, 0, 0], [.33, .33, .33], 0, 1) libtcodpy.heightmap_add_voronoi(hmap, 10, 3, [1, 3, 5]) libtcodpy.heightmap_add_fbm(hmap, noise, 1, 1, 1, 1, 4, 1, 1) libtcodpy.heightmap_scale_fbm(hmap, noise, 1, 1, 1, 1, 4, 1, 1) libtcodpy.heightmap_dig_bezier(hmap, [0, 16, 16, 0], [0, 0, 16, 16], 1, 1, 1, 1) # read data libtcodpy.heightmap_get_value(hmap, 0, 0) libtcodpy.heightmap_get_interpolated_value(hmap, 0, 0) libtcodpy.heightmap_get_slope(hmap, 0, 0) libtcodpy.heightmap_get_normal(hmap, 0, 0, 0) libtcodpy.heightmap_count_cells(hmap, 0, 0) libtcodpy.heightmap_has_land_on_border(hmap, 0) libtcodpy.heightmap_get_minmax(hmap) libtcodpy.noise_delete(noise) libtcodpy.heightmap_delete(hmap)
def MasterWorldGen(): # ------------------------------------------------------- * MASTER GEN * ------------------------------------------------------------- print(" * World Gen START * ") starttime = time.time() # Heightmap hm = tcod.heightmap_new(WORLD_WIDTH, WORLD_HEIGHT) for i in range(250): tcod.heightmap_add_hill( hm, randint(WORLD_WIDTH / 10, WORLD_WIDTH - WORLD_WIDTH / 10), randint(WORLD_HEIGHT / 10, WORLD_HEIGHT - WORLD_HEIGHT / 10), randint(12, 16), randint(6, 10), ) print("- Main Hills -") for i in range(1000): tcod.heightmap_add_hill( hm, randint(WORLD_WIDTH / 10, WORLD_WIDTH - WORLD_WIDTH / 10), randint(WORLD_HEIGHT / 10, WORLD_HEIGHT - WORLD_HEIGHT / 10), randint(2, 4), randint(6, 10), ) print("- Small Hills -") tcod.heightmap_normalize(hm, 0.0, 1.0) noisehm = tcod.heightmap_new(WORLD_WIDTH, WORLD_HEIGHT) noise2d = tcod.noise_new( 2, tcod.NOISE_DEFAULT_HURST, tcod.NOISE_DEFAULT_LACUNARITY ) # tcod.heightmap_add_fbm(noisehm, noise2d,6, 6, 0, 0, 32, 1, 1) tcod.heightmap_normalize(noisehm, 0.0, 1.0) # tcod.heightmap_multiply_hm(hm, noisehm, hm) print("- Apply Simplex -") PoleGen(hm, 0) print("- South Pole -") PoleGen(hm, 1) print("- North Pole -") TectonicGen(hm, 0) TectonicGen(hm, 1) print("- Tectonic Gen -") tcod.heightmap_rain_erosion(hm, WORLD_WIDTH * WORLD_HEIGHT, 0.07, 0, 0) print("- Erosion -") tcod.heightmap_clamp(hm, 0.0, 1.0) # Temperature temp = tcod.heightmap_new(WORLD_WIDTH, WORLD_HEIGHT) Temperature(temp, hm) tcod.heightmap_normalize(temp, 0.0, 1.0) print("- Temperature Calculation -") # Precipitation preciphm = tcod.heightmap_new(WORLD_WIDTH, WORLD_HEIGHT) Percipitaion(preciphm, temp) tcod.heightmap_normalize(preciphm, 0.0, 1.0) print("- Percipitaion Calculation -") # Drainage drainhm = tcod.heightmap_new(WORLD_WIDTH, WORLD_HEIGHT) drain = tcod.noise_new( 2, tcod.NOISE_DEFAULT_HURST, tcod.NOISE_DEFAULT_LACUNARITY ) # tcod.heightmap_add_fbm(drainhm,drain ,2, 2, 0, 0, 32, 1, 1) tcod.heightmap_normalize(drainhm, 0.0, 1.0) print("- Drainage Calculation -") # VOLCANISM - RARE AT SEA FOR NEW ISLANDS (?) RARE AT MOUNTAINS > 0.9 (?) RARE AT TECTONIC BORDERS (?) elapsed_time = time.time() - starttime print(" * World Gen DONE * in: ", elapsed_time, " seconds") # Initialize Tiles with Map values World = [[0 for y in range(WORLD_HEIGHT)] for x in range(WORLD_WIDTH)] for x in range(WORLD_WIDTH): for y in range(WORLD_HEIGHT): World[x][y] = Tile( tcod.heightmap_get_value(hm, x, y), tcod.heightmap_get_value(temp, x, y), tcod.heightmap_get_value(preciphm, x, y), tcod.heightmap_get_value(drainhm, x, y), 0, ) print("- Tiles Initialized -") # Prosperity Prosperity(World) print("- Prosperity Calculation -") # Biome info to Tile for x in range(WORLD_WIDTH): for y in range(WORLD_HEIGHT): if ( World[x][y].precip >= 0.10 and World[x][y].precip < 0.33 and World[x][y].drainage < 0.5 ): World[x][y].biomeID = 3 if randint(1, 2) == 2: World[x][y].biomeID = 16 if World[x][y].precip >= 0.10 and World[x][y].precip > 0.33: World[x][y].biomeID = 2 if World[x][y].precip >= 0.66: World[x][y].biomeID = 1 if ( World[x][y].precip >= 0.33 and World[x][y].precip < 0.66 and World[x][y].drainage >= 0.33 ): World[x][y].biomeID = 15 if randint(1, 5) == 5: World[x][y].biomeID = 5 if ( World[x][y].temp > 0.2 and World[x][y].precip >= 0.66 and World[x][y].drainage > 0.33 ): World[x][y].biomeID = 5 if World[x][y].precip >= 0.75: World[x][y].biomeID = 6 if randint(1, 5) == 5: World[x][y].biomeID = 15 if ( World[x][y].precip >= 0.10 and World[x][y].precip < 0.33 and World[x][y].drainage >= 0.5 ): World[x][y].biomeID = 16 if randint(1, 2) == 2: World[x][y].biomeID = 14 if World[x][y].precip < 0.10: World[x][y].biomeID = 4 if World[x][y].drainage > 0.5: World[x][y].biomeID = 16 if randint(1, 2) == 2: World[x][y].biomeID = 14 if World[x][y].drainage >= 0.66: World[x][y].biomeID = 8 if World[x][y].height <= 0.2: World[x][y].biomeID = 0 if World[x][y].temp <= 0.2 and World[x][y].height > 0.15: World[x][y].biomeID = randint(11, 13) if World[x][y].height > 0.6: World[x][y].biomeID = 9 if World[x][y].height > 0.9: World[x][y].biomeID = 10 print("- BiomeIDs Atributed -") # River Gen for x in range(1): RiverGen(World) print("- River Gen -") # Free Heightmaps tcod.heightmap_delete(hm) tcod.heightmap_delete(temp) tcod.heightmap_delete(noisehm) print(" * Biomes/Rivers Sorted *") return World
# A direct translation of Jice's worldgen tool. import math import numpy as np import random import tcod import attr from tcod import Color from tcod.noise import Noise from itertools import count from collections import namedtuple from enum import Enum from numba import jit, jitclass from numba import int32, float32, void noise1d = tcod.noise_new(1) # noise.NoiseGenerator(1) noise2d = tcod.noise_new(2) # noise.NoiseGenerator(2) # Height and Biome Constants # -------------------------- class Climate(Enum): arctic_alpine = 0 cold = 1 temperate = 2 warm = 3 tropical = 4 def get_climate_from_temp(temperature): if temperature <= -5: