def generate_global_map(shape: tuple) -> typing.List[typing.List[Tile]]:
    """Return simple rectangular map with shape shape
    Precondition: len(shape)==2
    """
    # create height map
    global_map = tcod.heightmap_new(shape[0], shape[1])
    # voroni
    tcod.heightmap_add_voronoi(global_map,
                               2,
                               2, [0.1, 1.5, 0.6, 1.7, 0.8],
                               rnd=0)
    # normalize
    tcod.heightmap_normalize(global_map)
    # assign TILE to every value of heightmap
    tile_map = []

    for row in global_map:
        holder = []
        for value in row:
            if value > UPPER_BOUND:
                holder.append(Tile(True))
            elif value > MID_BOUND:
                holder.append(Tile(True, block_sight=False))
            else:
                holder.append(Tile(False))
        tile_map.append(holder)
    return tile_map
Exemple #2
0
def gen(rng, dim=(500, 150), num_mountain_ranges=5, num_guaranteed_paths=5, num_lakes=20, num_rivers=20, num_cities=20, num_forests=30, num_deserts=60, terrain_info=default_terrain_info):
	margin = int(dim[1] / 4)
	range_dist = int(dim[0] / (num_mountain_ranges + 1))
	max_point_offset = int(range_dist / 10)
	ending_point = clamp_point(dim, (int(range_dist / 2) + rng.randint(-max_point_offset, max_point_offset), rng.randint(margin, dim[1] - margin)))
	starting_point = clamp_point(dim, (dim[0] - int(range_dist / 2) + rng.randint(-max_point_offset, max_point_offset), rng.randint(margin, dim[1] - margin)))

	noise = tcod.noise.Noise(2, seed=rng)
	height = make_base_heightmap(dim, noise)
	height_pather = tcod.path.AStar(height)
	mountain_spines = carve_mountains(height, dim, num_mountain_ranges, height_pather, rng)
	lake_points = carve_lakes(height, dim, num_mountain_ranges, height_pather, rng)
	height[:] += 1
	smooth(height, dim, rng)

	norm_height = tcod.heightmap_new(*dim)
	tcod.heightmap_copy(height, norm_height)
	tcod.heightmap_normalize(norm_height, 0, 1)

	terrain = tilemap.Tilemap(dim, init=lambda _: things.desert)
	assign_base_terrain(terrain, norm_height, dim, terrain_info)
	make_forests(terrain, height, dim, num_forests, height_pather, rng)
	run_rivers(terrain, height, lake_points, dim, num_rivers, rng, max_x_offset=range_dist)
	walkability = make_walk_map(terrain, height, dim)
	walk_pather = tcod.path.AStar(walkability)
	make_guaranteed_paths(terrain, height, dim, starting_point, ending_point, num_guaranteed_paths, num_mountain_ranges, walk_pather, rng)
	make_deserts(terrain, height, dim, num_deserts, height_pather, rng)
	city_points = make_cities(terrain, dim, num_cities, rng, range_dist)
	make_roads(terrain, height, city_points, dim, walk_pather, rng)

	return terrain, starting_point, ending_point, city_points, mountain_spines
Exemple #3
0
def make_walk_map(terrain, height, dim, water_cost=100):
	walkability = tcod.heightmap_new(*dim)
	tcod.heightmap_copy(height, walkability)
	for x in range(dim[0]):
		for y in range(dim[1]):
			if terrain[x, y] == things.water:
				walkability[y, x] = water_cost
	return walkability
Exemple #4
0
def make_deserts(terrain, height, dim, num_deserts, pather, rng, min_length=5, max_length=40, max_r=40, min_radius=8):
	template = tcod.heightmap_new(*dim)
	for (x, y), r in rand_grouped_blobs(dim, num_deserts, pather, rng, min_length, max_length, max_r, min_radius):
		tcod.heightmap_dig_hill(template, x, y, r, 10)
	for x in range(dim[0]):
		for y in range(dim[1]):
			h = template[y, x]
			if h > 5 and terrain[x, y] == things.grassland:
				terrain[x, y] = things.desert
Exemple #5
0
def make_base_heightmap(dim, noise):
	height = tcod.heightmap_new(*dim)
	height[:] = 1
	tcod.heightmap_add_fbm(height,
		noise = noise,
		mulx = 6,
		muly = 6,
		addx = 0,
		addy = 0,
		octaves = 5,
		delta = 0,
		scale = 1
	)
	tcod.heightmap_normalize(height, 0.1, 1.5)
	return height
Exemple #6
0
def run_rivers(terrain, height, lake_points, dim, num_rivers, rng, max_x_offset):
	blocking = tcod.heightmap_new(*dim)
	tcod.heightmap_copy(height, blocking)
	pather = tcod.path.AStar(blocking, diagonal=100)
	for i in range(num_rivers):
		start = lake_points[rng.randint(0, len(lake_points) - 1)]
		end = clamp_point(dim, (max(0, min(dim[0], start[0] + rng.randint(-max_x_offset, max_x_offset))), rng.randint(0, dim[1] - 1)))
		left_source = False
		for x, y in pather.get_path(start[0], start[1], end[0], end[1]):
			if (terrain[x, y] == things.water and left_source) or terrain[x, y] == things.mountains:
				break
			if terrain[x, y] != things.water:
				left_source = True
			terrain[x, y] = things.water
			tcod.heightmap_dig_hill(blocking, x, y, 4, 100)
Exemple #7
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)
Exemple #9
0
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)
Exemple #10
0
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
Exemple #11
0
 def __init__(self, width, height):
     self.width = width
     self.height = height
     self._data = tcod.heightmap_new(width, height)