Esempio n. 1
0
    def __init__(self, sector, r_factor=0.40, g_factor=0.40, b_factor=0.75, seed=95837203, size=512):
        self.seed = randrange(1,10000) if seed is None else seed
        self.sector = sector

        self.parallax_speed = 0.1

        self.starting_left = 0 - self.sector.screen_width/2
        self.starting_top  = 0 + self.sector.screen_height/2

        self.r_factor = r_factor
        self.g_factor = g_factor
        self.b_factor = b_factor

        self.noise_zoom = 2.0
        self.noise_octaves = 4.0

        self.size = size

        self.r_rand = libtcod.random_new_from_seed(self.seed)
        self.g_rand = libtcod.random_new_from_seed(self.seed+1)
        self.b_rand = libtcod.random_new_from_seed(self.seed+2)
        self.c_rand = libtcod.random_new_from_seed(self.seed*2)
        self.s_rand = libtcod.random_new_from_seed(self.seed*3)

        self.r_noise = libtcod.noise_new(2, libtcod.NOISE_DEFAULT_HURST, libtcod.NOISE_DEFAULT_LACUNARITY, self.r_rand)
        self.g_noise = libtcod.noise_new(2, libtcod.NOISE_DEFAULT_HURST, libtcod.NOISE_DEFAULT_LACUNARITY, self.g_rand)
        self.b_noise = libtcod.noise_new(2, libtcod.NOISE_DEFAULT_HURST, libtcod.NOISE_DEFAULT_LACUNARITY, self.b_rand)
        self.c_noise = libtcod.noise_new(2, libtcod.NOISE_DEFAULT_HURST, libtcod.NOISE_DEFAULT_LACUNARITY, self.c_rand)
        self.s_noise = libtcod.noise_new(2, libtcod.NOISE_DEFAULT_HURST, libtcod.NOISE_DEFAULT_LACUNARITY, self.s_rand)

        self.grid = [[None for i in range(self.size)] for i in range(self.size)]
        self.last_top = None
        self.last_left = None
Esempio n. 2
0
def render_all():
    global color_light_wall
    global color_light_ground
    map_rng = libtcod.random_new_from_seed(1, algo=libtcod.RNG_MT)

    #go through all tiles, and set their background color
    for y in range(MAP_HEIGHT):
        for x in range(MAP_WIDTH):
            wall = dungeon_map[x][y].block_sight
            if wall:
                libtcod.console_put_char_ex(
                    con, x, y, WALL_CONST, color_dark_wall,
                    libtcod.light_grey *
                    libtcod.random_get_float(map_rng, 0.7, 0.8))
            else:
                libtcod.console_put_char_ex(
                    con, x, y, FLOOR_CONST, color_dark_ground,
                    libtcod.dark_grey *
                    libtcod.random_get_float(map_rng, 0.2, 0.5))

    #draw all objects in the list
    for obj in objects:
        obj.draw()

    #blit the contents of "con" to the root console
    libtcod.console_blit(con, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, 0)
Esempio n. 3
0
def _build_map(new_map):
    new_map.rng = libtcod.random_new_from_seed(new_map.random_seed)

    new_map.spare_terrain = copy.deepcopy(
        new_map.terrain
    )  # [[0 for y in range(new_map.height)] for x in range(new_map.width)]
    dig_ca_region(new_map, algebra.Rect(0, 0, new_map.width, new_map.height),
                  4, 3)

    center = algebra.Location(new_map.width / 2, new_map.height / 2)
    stair_loc = _probe_for_stair(new_map, range(new_map.width - 2, center.x,
                                                -1), center.y)
    if not stair_loc:
        # Uh-oh; no guarantee of completion
        print('Recursing with unenterable map:')
        # _dump(new_map)
        new_map.random_seed = libtcod.random_save(new_map.rng)
        return _build_map(new_map)

    pool_x = new_map.width / 4
    for x in range(pool_x - 6, pool_x + 7):
        for y in range(center.y - 6, center.y + 7):
            dx = x - pool_x
            dy = y - center.y
            if math.sqrt(dx**2 + dy**2) > 6:
                continue
            if new_map.terrain[x][y] == map.TERRAIN_WALL:
                new_map.terrain[x][y] = map.TERRAIN_GROUND

    new_map.pool_x = pool_x
    _scatter_ponds(new_map)

    # Can we reach from the stairs to the center of the pool?
    _floodfill(new_map, stair_loc.x, stair_loc.y, map.TERRAIN_GROUND,
               map.TERRAIN_FLOOR)
    if new_map.terrain[pool_x][center.y] != map.TERRAIN_FLOOR:
        # Uh-oh; no guarantee of completion
        print('Recursing with disconnected map:')
        # _dump(new_map)
        new_map.random_seed = libtcod.random_save(new_map.rng)
        return _build_map(new_map)

    # Close up any unconnected subcaves; flood any western bits
    for x in range(1, new_map.width - 1):
        for y in range(1, new_map.height - 1):
            if new_map.terrain[x][y] == map.TERRAIN_GROUND:
                new_map.terrain[x][y] = map.TERRAIN_WALL
            elif x < pool_x and new_map.terrain[x][y] == map.TERRAIN_FLOOR:
                new_map.terrain[x][y] = map.TERRAIN_WATER

    #for x in range(0, new_map.width):
    #    new_map.terrain[x][0] = map.TERRAIN_WALL
    #    new_map.terrain[x][new_map.height-1] = map.TERRAIN_WALL
    #for y in range(0, new_map.height):
    #    new_map.terrain[0][y] = map.TERRAIN_WALL
    #    new_map.terrain[new_map.width-1][y] = map.TERRAIN_WALL

    return stair_loc
Esempio n. 4
0
def make_rivers(heightmap, size, seed, river_count=None):
    rivers = []
    sealevel = -15
    random = lt.random_new()
    if seed:
        random = lt.random_new_from_seed(seed)
    if river_count is None:
        river_count = lt.random_get_int(random, 10, 15)

    mouths = [(0, 0)]
    for river in xrange(river_count):
        while True:
            setting = True
            col = lt.random_get_int(random, 0, size - 1)
            row = lt.random_get_int(random, 0, size - 1)
            if sealevel > lt.heightmap_get_value(heightmap, row, col) >= sealevel - 4:
                for mouth in mouths:
                    if abs(col - mouth[0]) < 5 and abs(row - mouth[1]) < 5:
                        setting = False
                if setting:
                    mouths.append((col, row))
                    rivers.append(River(col, row, heightmap, size, random))
                    break
    visualize(rivers, False)

    # Clean up inappropriate rivers.
    to_remove = set()
    i = -1
    for river in rivers:
        i += 1
        if len(river.tiles) < 15:
            to_remove.add(i)
        if lt.heightmap_get_value(heightmap, river.head_row, river.head_col) < 30:
            to_remove.add(i)
        for other in rivers:
            if river != other:
                x = True
                for n in list(to_remove):
                    if other == rivers[n] or river == rivers[n]:
                        x = False
                if x:
                    for (this_x, this_y) in river.tiles:
                        for (other_x, other_y) in other.tiles:
                            distance = ((this_x - other_x) ** 2 + (this_y - other_y) ** 2) ** 0.5
                            if distance < 2:
                                to_remove.add(i)
                                break
    remove = sorted(list(to_remove), reverse=True)
    for n in remove:
        rivers.pop(n)

    if len(rivers) > 0:
        visualize(heightmap, False)
        visualize(rivers)
    else:
        visualize(heightmap)

    return rivers
Esempio n. 5
0
    def spherical_noise(self,
            noise_dx=0.0,
            noise_dy=0.0,
            noise_dz=0.0,
            noise_octaves=4.0,
            noise_zoom=1.0,
            noise_hurst=libtcod.NOISE_DEFAULT_HURST,
            noise_lacunarity=libtcod.NOISE_DEFAULT_LACUNARITY,
            width=None,
            height=None,
            seed=None):
        self.rnd = libtcod.random_new_from_seed(self.seed) if seed is None else libtcod.random_new_from_seed(seed)

        noise = libtcod.noise_new(3, noise_hurst, noise_lacunarity, self.rnd)
        hm = libtcod.heightmap_new(width, height)

        noise_dx += 0.01
        noise_dy += 0.01
        noise_dz += 0.01

        pi_times_two = 2 * math.pi
        pi_div_two = math.pi / 2.0

        theta = 0.0
        phi = pi_div_two * -1.0
        x = 0
        y = 0

        while phi <= pi_div_two:
            while theta <= pi_times_two:
                f = [
                    noise_zoom * math.cos(phi) * math.cos(theta),
                    noise_zoom * math.cos(phi) * math.sin(theta),
                    noise_zoom * math.sin(phi),
                ]
                value = libtcod.noise_get_fbm(noise, f, noise_octaves, libtcod.NOISE_PERLIN)
                # print((x, y, value))
                libtcod.heightmap_set_value(hm, x, y, value)
                theta += (pi_times_two / width)
                x += 1
            phi += (math.pi / (height-1))
            y += 1
            x = 0
            theta = 0.0
        return hm
Esempio n. 6
0
def _build_map(new_map):
    new_map.rng = libtcod.random_new_from_seed(new_map.random_seed)

    new_map.spare_terrain = copy.deepcopy(new_map.terrain) # [[0 for y in range(new_map.height)] for x in range(new_map.width)]
    dig_ca_region(new_map, algebra.Rect(0, 0, new_map.width, new_map.height), 4, 3)

    center = algebra.Location(new_map.width / 2, new_map.height / 2)
    stair_loc = _probe_for_stair(new_map,
                                 range(new_map.width - 2, center.x, -1),
                                 center.y)
    if not stair_loc:
        # Uh-oh; no guarantee of completion
        print('Recursing with unenterable map:')
        # _dump(new_map)
        new_map.random_seed = libtcod.random_save(new_map.rng)
        return _build_map(new_map)

    pool_x = new_map.width / 4
    for x in range(pool_x - 6, pool_x + 7):
        for y in range(center.y - 6, center.y + 7):
            dx = x - pool_x
            dy = y - center.y
            if math.sqrt(dx ** 2 + dy ** 2) > 6:
                continue
            if new_map.terrain[x][y] == map.TERRAIN_WALL:
                new_map.terrain[x][y] = map.TERRAIN_GROUND

    new_map.pool_x = pool_x
    _scatter_ponds(new_map)

    # Can we reach from the stairs to the center of the pool?
    _floodfill(new_map, stair_loc.x, stair_loc.y, map.TERRAIN_GROUND, map.TERRAIN_FLOOR)
    if new_map.terrain[pool_x][center.y] != map.TERRAIN_FLOOR:
         # Uh-oh; no guarantee of completion
        print('Recursing with disconnected map:')
        # _dump(new_map)
        new_map.random_seed = libtcod.random_save(new_map.rng)
        return _build_map(new_map)

    # Close up any unconnected subcaves; flood any western bits
    for x in range(1, new_map.width-1):
        for y in range(1, new_map.height-1):
            if new_map.terrain[x][y] == map.TERRAIN_GROUND:
                new_map.terrain[x][y] = map.TERRAIN_WALL
            elif x < pool_x and new_map.terrain[x][y] == map.TERRAIN_FLOOR:
                new_map.terrain[x][y] = map.TERRAIN_WATER

    #for x in range(0, new_map.width):
    #    new_map.terrain[x][0] = map.TERRAIN_WALL
    #    new_map.terrain[x][new_map.height-1] = map.TERRAIN_WALL
    #for y in range(0, new_map.height):
    #    new_map.terrain[0][y] = map.TERRAIN_WALL
    #    new_map.terrain[new_map.width-1][y] = map.TERRAIN_WALL

    return stair_loc
Esempio n. 7
0
def _build_map(new_map):
    new_map.rng = libtcod.random_new_from_seed(new_map.random_seed)
    num_rooms = 0
    for r in range(MAX_ROOMS):
        w = libtcod.random_get_int(new_map.rng, ROOM_MIN_SIZE, ROOM_MAX_SIZE)
        h = libtcod.random_get_int(new_map.rng, ROOM_MIN_SIZE, ROOM_MAX_SIZE)
        x = libtcod.random_get_int(new_map.rng, 0, new_map.width - w - 1)
        y = libtcod.random_get_int(new_map.rng, 0, new_map.height - h - 1)

        new_room = map.Room(x, y, w, h)

        failed = False
        for other_room in new_map.rooms:
            if new_room.intersect(other_room):
                failed = True
                break

        if not failed:
            # There are no intersections, so this room is valid.
            _create_room(new_map, new_room)
            new_ctr = new_room.center()

            if num_rooms > 0:
                prev_ctr = new_map.rooms[num_rooms - 1].center()

                if libtcod.random_get_int(new_map.rng, 0, 1) == 1:
                    _create_h_tunnel(new_map, prev_ctr.x, new_ctr.x,
                                     prev_ctr.y)
                    _create_v_tunnel(new_map, prev_ctr.y, new_ctr.y, new_ctr.x)
                else:
                    _create_v_tunnel(new_map, prev_ctr.y, new_ctr.y,
                                     prev_ctr.x)
                    _create_h_tunnel(new_map, prev_ctr.x, new_ctr.x, new_ctr.y)

            new_map.rooms.append(new_room)
            num_rooms += 1

    # Create stairs at the center of the last room.
    stairs = Object(new_ctr,
                    '<',
                    'stairs down',
                    libtcod.white,
                    always_visible=True)
    stairs.destination = None
    stairs.dest_position = None
    new_map.objects.insert(0, stairs)
    new_map.portals.insert(0, stairs)
Esempio n. 8
0
def test_random():
    rand = libtcodpy.random_get_instance()
    rand = libtcodpy.random_new()
    libtcodpy.random_delete(rand)
    rand = libtcodpy.random_new_from_seed(42)
    libtcodpy.random_set_distribution(rand, libtcodpy.DISTRIBUTION_LINEAR)
    libtcodpy.random_get_int(rand, 0, 1)
    libtcodpy.random_get_int_mean(rand, 0, 1, 0)
    libtcodpy.random_get_float(rand, 0, 1)
    libtcodpy.random_get_double(rand, 0, 1)
    libtcodpy.random_get_float_mean(rand, 0, 1, 0)
    libtcodpy.random_get_double_mean(rand, 0, 1, 0)

    backup = libtcodpy.random_save(rand)
    libtcodpy.random_restore(rand, backup)

    libtcodpy.random_delete(rand)
    libtcodpy.random_delete(backup)
Esempio n. 9
0
def load_game():
	if not game.savefiles:
		contents = ['There are no saved games.']
		game.messages.box('Saved games', None, 'center_screenx', 'center_screeny', len(max(contents, key=len)) + 16, len(contents) + 4, contents, input=False, align=libtcod.CENTER)
	else:
		desc = []
		for i in range(len(game.savefiles)):
			f = open('saves/' + game.savefiles[i], 'rb')
			pl = pickle.load(f)
			desc.append(pl.name + ', a level ' + str(pl.level) + ' ' + pl.gender + ' ' + pl.race + ' ' + pl.profession)
			f.close()
		choice = game.messages.box('Saved games', None, (game.SCREEN_WIDTH - (max(60, len(max(desc, key=len)) + 20))) / 2, ((game.SCREEN_HEIGHT + 1) - max(16, len(desc) + 4)) / 2, max(60, len(max(desc, key=len)) + 20), max(16, len(desc) + 4), desc, step=2, mouse_exit=True)
		if choice != -1:
			contents = ['Loading.....']
			game.messages.box(None, None, 'center_screenx', 'center_screeny', len(max(contents, key=len)) + 16, len(contents) + 4, contents, input=False, align=libtcod.CENTER, nokeypress=True)
			f = open('saves/' + game.savefiles[choice], 'rb')
			game.player = pickle.load(f)
			game.worldmap = pickle.load(f)
			game.current_map = pickle.load(f)
			game.old_maps = pickle.load(f)
			game.message = pickle.load(f)
			game.rnd = pickle.load(f)
			game.turns = pickle.load(f)
			game.gametime = pickle.load(f)
			game.fov_torch = pickle.load(f)
			game.game_state = pickle.load(f)
			game.times_saved = pickle.load(f)
			f.close()
			fetch_autosave()
			game.rnd = libtcod.random_new_from_seed(game.rnd)
			game.char = game.current_map.objects[0]
			game.worldmap.create_map_images(1)
			game.message.empty()
			game.message.trim_history()
			game.message.new('Welcome back, ' + game.player.name + '!', game.turns, libtcod.Color(96, 212, 238))
			if game.current_map.location_id == 0:
				util.fetch_border_maps()
				util.combine_maps()
			game.current_map.check_player_position()
			#print game.worldmap.dungeons
			return True
	return False
Esempio n. 10
0
    def __init__(self, biome, height, width):
        self.con = lt.console_new(width, height)
        self.area = [[Tile(col, row, ' ') for row in xrange(width)] for col in xrange(height)]
        self.random = lt.random_new_from_seed(WORLD_SEED)
        self.area, self.fov_map = area_gen.make_area(self.area, biome, 1, self.random)

        biomes = {
            "cave": {
                "fog": lt.Color(20, 10, 15),
                "fog density": 0.4,    # Lower is more dense
                "items": default_cave_items,
                "structures": []
            },
        }

        biome = biomes[biome]
        self.fog = biome["fog"]
        self.fog_density = biome["fog density"]
        self.items = biome["items"](self.area)
        self.structures = biome["structures"]
Esempio n. 11
0
def render_all():
    global color_light_wall
    global color_light_ground
    map_rng = libtcod.random_new_from_seed(1, algo=libtcod.RNG_MT)

    #go through all tiles, and set their background color
    for y in range(MAP_HEIGHT):
        for x in range(MAP_WIDTH):
            wall = dungeon_map[x][y].block_sight
            if wall:
                libtcod.console_put_char_ex(con, x, y,  WALL_CONST, color_dark_wall, libtcod.light_grey * libtcod.random_get_float(map_rng, 0.7, 0.8) )
            else:
                libtcod.console_put_char_ex(con, x, y, FLOOR_CONST, color_dark_ground, libtcod.dark_grey * libtcod.random_get_float(map_rng, 0.2, 0.5) )

    #draw all objects in the list
    for obj in objects:
        obj.draw()

    #blit the contents of "con" to the root console
    libtcod.console_blit(con, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, 0)
def _build_map(new_map):
    new_map.rng = libtcod.random_new_from_seed(new_map.random_seed)
    num_rooms = 0
    for r in range(MAX_ROOMS):
        w = libtcod.random_get_int(new_map.rng, ROOM_MIN_SIZE, ROOM_MAX_SIZE)
        h = libtcod.random_get_int(new_map.rng, ROOM_MIN_SIZE, ROOM_MAX_SIZE)
        x = libtcod.random_get_int(new_map.rng, 0, new_map.width - w - 1)
        y = libtcod.random_get_int(new_map.rng, 0, new_map.height - h - 1)

        new_room = map.Room(x, y, w, h)

        failed = False
        for other_room in new_map.rooms:
            if new_room.intersect(other_room):
                failed = True
                break

        if not failed:
            # There are no intersections, so this room is valid.
            _create_room(new_map, new_room)
            new_ctr = new_room.center()

            if num_rooms > 0:
                prev_ctr = new_map.rooms[num_rooms-1].center()

                if libtcod.random_get_int(new_map.rng, 0, 1) == 1:
                    _create_h_tunnel(new_map, prev_ctr.x, new_ctr.x, prev_ctr.y)
                    _create_v_tunnel(new_map, prev_ctr.y, new_ctr.y, new_ctr.x)
                else:
                    _create_v_tunnel(new_map, prev_ctr.y, new_ctr.y, prev_ctr.x)
                    _create_h_tunnel(new_map, prev_ctr.x, new_ctr.x, new_ctr.y)

            new_map.rooms.append(new_room)
            num_rooms += 1

    # Create stairs at the center of the last room.
    stairs = Object(new_ctr, '<', 'stairs down', libtcod.white, always_visible=True)
    stairs.destination = None
    stairs.dest_position = None
    new_map.objects.insert(0, stairs)
    new_map.portals.insert(0, stairs)
Esempio n. 13
0
    def __init__(self, width, height, seed=54):
        self.screen_width = width
        self.screen_height = height
        self.seed = seed
        random.seed(seed)
        self.rnd = libtcod.random_new_from_seed(self.seed)

        # Load Random Names
        self.planet_names = []
        with open("planet_names", "r") as planet_names_file:
            self.planet_names = planet_names_file.readlines()
        random.shuffle(self.planet_names)
        self.planet_name_index = -1

        # Build Galaxy Map
        self.bsp_depth = 6
        self.bsp = libtcod.bsp_new_with_size(0, 0, self.screen_width, self.screen_height)
        libtcod.bsp_split_recursive(self.bsp, self.rnd, self.bsp_depth, 8, 8, 1.0, 1.0)

        # Count number of sectors
        count = [ 0 ]
        def count_bsp_leaf_nodes(node, userData):
            if node.level == self.bsp_depth:
                count[0] += 1
            return True
        libtcod.bsp_traverse_inverted_level_order(self.bsp, count_bsp_leaf_nodes, userData=None)
        self.sector_count = count[0]
        # self.sector_count = 2**self.bsp_depth # only if we have a fully populated tree (not guaranteed)

        self.sectors = []
        for i in range(0, self.sector_count):
            self.new_sector()

        self.link_sectors()

        self.current_sector = random.randrange(self.sector_count)
        # pp("total sectors: {}  current sector: {}".format(self.sector_count, self.current_sector))
        self.targeted_sector_index = 0
        self.selected_blink = 0
Esempio n. 14
0
def make_heightmap(size, seed):

    # Gradient generated by distance to the northeast corner (creates northeast ocean).
    gradient1 = lt.heightmap_new(size, size)
    for col in xrange(size):
        for row in xrange(size):
            distance = ((row - size) ** 2 + col ** 2) ** 0.5
            lt.heightmap_set_value(gradient1, row, col, distance)
    lt.heightmap_clamp(gradient1, mi=0, ma=WORLD_SIZE)
    lt.heightmap_scale(gradient1, 2)
    # Similar gradient, but cube root (creates mountains around edge).
    gradient2 = lt.heightmap_new(size, size)
    for col in xrange(size):
        for row in xrange(size):
            distance = ((row - size) ** 2 + col ** 2) ** 0.33
            lt.heightmap_set_value(gradient2, row, col, distance)
    lt.heightmap_clamp(gradient2, mi=0, ma=WORLD_SIZE / 6)
    lt.heightmap_scale(gradient2, 5)

    # Height map based on Perlin noise.
    heightmap = lt.heightmap_new(size, size)
    random = lt.random_new()
    if seed:
        random = lt.random_new_from_seed(seed)
    perlin = lt.noise_new(2, h=2, l=2, random=random)

    lt.heightmap_add_fbm(heightmap, perlin, mulx=3, muly=3, addx=0, addy=0, octaves=8, delta=50, scale=100)

    # Add in gradients.
    lt.heightmap_add_hm(heightmap, gradient1, heightmap)
    lt.heightmap_add_hm(heightmap, gradient2, heightmap)

    lt.heightmap_normalize(heightmap, mi=-100, ma=105)
    lt.heightmap_clamp(heightmap, mi=-50, ma=100)
    lt.heightmap_normalize(heightmap, mi=-100, ma=100)
    visualize(heightmap)

    return heightmap
Esempio n. 15
0
def make_map(player, dungeon_level):
    """
    """
    old_map = player.current_map

    new_map = map.DungeonMap(MINE_SIZE, MINE_SIZE, dungeon_level)
    new_map.objects.append(player)
    player.current_map = new_map
    player.camera_position = algebra.Location(0, 0)
    new_map.random_seed = libtcod.random_save(0)
    new_map.rng = libtcod.random_new_from_seed(new_map.random_seed)

    old_quarry_stairs = old_map.quarry_stairs
    _link_up_stairs(new_map, old_map, old_quarry_stairs)
    _create_entries(new_map, old_quarry_stairs)
    _descend_stairs(new_map, player, old_quarry_stairs)
    _dig_some_caves(new_map, old_quarry_stairs)
    _dig_mine_tunnels(new_map)

    map_bounds = algebra.Rect(1, 1, new_map.width-1, new_map.height-1)
    for x in range(1, new_map.width-1):
        for y in range(1, new_map.height-1):
            if libtcod.random_get_float(new_map.rng, 0., 1.) < 0.2:
                new_map.terrain[x][y] = map.TERRAIN_GROUND

    ca_cartographer._generation(new_map, map_bounds, 7, 1)
    ca_cartographer._generation(new_map, map_bounds, 5, 1)

    # Redig the initial rooms because the CA can fill in the stairs
    for i in range(3):
        _create_room(new_map, new_map.rooms[i])

    for i in range(3):
        stair_pos = old_quarry_stairs[i].dest_position
        ca_cartographer._floodfill(new_map, stair_pos.x, stair_pos.y,
            map.TERRAIN_GROUND, map.TERRAIN_FLOOR)

    for x in range(1, new_map.width-1):
        for y in range(1, new_map.height-1):
            if new_map.terrain[x][y] == map.TERRAIN_GROUND:
                new_map.terrain[x][y] = map.TERRAIN_WALL

    #for x in range(0, new_map.width):
    #    new_map.terrain[x][0] = map.TERRAIN_WALL
    #    new_map.terrain[x][new_map.height-1] = map.TERRAIN_WALL
    #for y in range(0, new_map.height):
    #    new_map.terrain[0][y] = map.TERRAIN_WALL
    #    new_map.terrain[new_map.width-1][y] = map.TERRAIN_WALL

    zone_divisor = MINE_SIZE / 3
    slime_zone = new_map.rnd(0, 2)
    while True:
        undead_zone = new_map.rnd(0, 2)
        if undead_zone != slime_zone:
            break

    for r in range(3, len(new_map.rooms)):
        if new_map.rnd(1, 4) < 3:
            room = new_map.rooms[r]
            zone = room.center().x / zone_divisor
            if zone == slime_zone:
                if new_map.rnd(1, 2) == 1:
                    bestiary.slime(new_map, _find_floor_near_room(new_map, room), player)
                    bestiary.slime(new_map, _find_floor_near_room(new_map, room), player)
                else:
                    bestiary.jelly(new_map, _find_floor_near_room(new_map, room), player)
            elif zone == undead_zone:
                bestiary.ghul(new_map, _find_floor_near_room(new_map, room), player)
            else:
                bestiary.worm(new_map, _find_floor_near_room(new_map, room), player)

    r = new_map.rnd(3, len(new_map.rooms) - 1)
    pos = new_map.rooms[r].center()
    while new_map.is_blocked_at(pos):
        pos += actions.random_direction()

    new_map.objects.insert(0, Object(pos, '%', "hero's corpse", libtcod.dark_red))
    sword = miscellany.the_black_sword()
    sword.pos = pos
    new_map.objects.insert(0, sword)

    new_map.initialize_fov()
    new_map.xp_visit = _dungeon_exploration
    return False  # Don't need to generate stairs in caller thanks to _link_up_stairs()
Esempio n. 16
0
#size of the map
MAP_WIDTH = 80
MAP_HEIGHT = 45

#map constants
WALL_CONST = '#'
FLOOR_CONST = '.'
ROOM_MAX_SIZE = 10
ROOM_MIN_SIZE = 6
MAX_ROOMS = 30

LIMIT_FPS = 20  #20 frames-per-second maximum

#create random number generator
rng = libtcod.random_new_from_seed(1, algo=libtcod.RNG_MT)

color_dark_wall = libtcod.lightest_grey
color_dark_ground = libtcod.lightest_grey

class Rect:
    #a rectangle on the map. used to characterize a room.
    def __init__(self, x, y, w, h):
        self.x1 = x
        self.y1 = y
        self.x2 = x + w
        self.y2 = y + h

    def center(self):
        center_x = (self.x1 + self.x2) / 2
        center_y = (self.y1 + self.y2) / 2
def _build_map(new_map):
    new_map.rng = libtcod.random_new_from_seed(new_map.random_seed)

    print('Seeding regions')
    for u in range(config.OUTDOOR_MAP_WIDTH / 10):
        for v in range(config.OUTDOOR_MAP_HEIGHT / 10):
            x = libtcod.random_get_int(new_map.rng, 0, 9) + u * 10
            y = libtcod.random_get_int(new_map.rng, 0, 9) + v * 10
            new_map.region_seeds.append([x, y])

    print('Growing the world-tree')
    region_tree = scipy.spatial.KDTree(new_map.region_seeds)

    new_map.region_terrain = [None for i in range(len(new_map.region_seeds))]
    new_map.region_elevations = [-1 for r in range(len(new_map.region_seeds))]
    new_map.region_entered = [False for i in range(len(new_map.region_seeds))]
    new_map.elevation_visited = [False for i in range(0, 10)]

    print('Assigning regions')
    for x in range(config.OUTDOOR_MAP_WIDTH):
        for y in range(config.OUTDOOR_MAP_HEIGHT):
            (d, i) = region_tree.query([[x, y]])
            new_map.region[x][y] = i[0]
            new_map.terrain[x][y] = map.TERRAIN_GROUND

    peak = [
        libtcod.random_get_int(new_map.rng,
                               int(config.OUTDOOR_MAP_WIDTH * .35),
                               int(config.OUTDOOR_MAP_WIDTH * .65)),
        libtcod.random_get_int(new_map.rng,
                               int(config.OUTDOOR_MAP_WIDTH * .35),
                               int(config.OUTDOOR_MAP_WIDTH * .65))
    ]
    print('The peak is at ' + str(peak[0]) + ', ' + str(peak[1]))

    for r in range(20):
        new_map.region_elevations[r] = 0
        new_map.region_elevations[380 + r] = 0
        new_map.region_elevations[r * 20] = 0
        new_map.region_elevations[r * 20 + 19] = 0

    (d, peak_regions) = region_tree.query([peak], 3)
    for p in peak_regions[0]:
        new_map.region_elevations[p] = 9

    _interpolate_heights(new_map, peak)
    _ensure_penultimate_height(new_map, peak, region_tree)
    _extend_hills(new_map, peak)
    _debug_region_heights(new_map)

    _clump_terrain(new_map)
    _place_seaside_height(new_map)
    # TODO: level_desert() here to guarantee caravanserai is in the northeast
    # TODO: sink_quarry() here before we _mark_slopes
    # to get rid of messy after-the-fact slope fixup in dig_quarry()
    strata = _find_terrain_types(new_map)
    _debug_region_terrain(new_map)

    _mark_slopes(new_map)
    _assign_terrain(new_map)

    _make_rotunda(new_map, peak)
    compound_cartographer.make_caravanserai(new_map)
    _dig_quarry(new_map, peak)
    _make_grotto(new_map)
    _site_final_dungeon(new_map, strata)

    new_map.peak = peak
Esempio n. 18
0
#create world
nwidth = 100
nheight = 60
alivechar = '+'
deadchar = ' '
char_option = 'ascii'
speed = .1
inc = 0.01

# default generator
default = libtcod.random_get_instance()
# another random generator
my_random = libtcod.random_new()
# a random generator with a specific seed
my_determinist_random = libtcod.random_new_from_seed(0xdeadbeef)

world = World(nwidth, nheight, alivechar, deadchar, char_option,
              my_determinist_random)

libtcod.console_set_custom_font(
    'oryx_tiles3.png', libtcod.FONT_TYPE_GREYSCALE | libtcod.FONT_LAYOUT_TCOD,
    32, 12)
libtcod.console_init_root(nwidth, nheight, 'johnstein\'s Game of RogueLife!',
                          False, libtcod.RENDERER_SDL)
libtcod.sys_set_fps(30)

libtcod.console_map_ascii_codes_to_font(256, 32, 0,
                                        5)  #map all characters in 1st row
libtcod.console_map_ascii_codes_to_font(256 + 32, 32, 0,
                                        6)  #map all characters in 2nd row
def make_final_map(player, dungeon_level):
    """
    """
    old_map = player.current_map

    new_map = map.DungeonMap(FINAL_DUNGEON_SIZE, FINAL_DUNGEON_SIZE, dungeon_level)
    new_map.objects.append(player)
    player.current_map = new_map
    player.camera_position = algebra.Location(0, 0)
    new_map.random_seed = libtcod.random_save(0)
    new_map.rng = libtcod.random_new_from_seed(new_map.random_seed)

    entry_stairs = old_map.dungeon_stairs
    mine_cartographer._link_up_stairs(new_map, old_map, entry_stairs)
    mine_cartographer._create_entries(new_map, entry_stairs)
    mine_cartographer._descend_stairs(new_map, player, entry_stairs)

    num_rooms = 3
    for r in range(3, MAX_ROOMS):
        w = libtcod.random_get_int(new_map.rng, ROOM_MIN_SIZE, ROOM_MAX_SIZE)
        h = libtcod.random_get_int(new_map.rng, ROOM_MIN_SIZE, ROOM_MAX_SIZE)
        x = libtcod.random_get_int(new_map.rng, 0, new_map.width - w - 1)
        y = libtcod.random_get_int(new_map.rng, 0, new_map.height - h - 1)

        new_room = map.Room(x, y, w, h)

        failed = False
        for other_room in new_map.rooms:
            if new_room.intersect(other_room):
                failed = True
                break

        if not failed:
            # There are no intersections, so this room is valid.
            _create_room(new_map, new_room, num_rooms)
            new_ctr = new_room.center()
            prev_ctr = new_map.rooms[num_rooms-3].center()

            if libtcod.random_get_int(new_map.rng, 0, 1) == 1:
                _create_h_tunnel(new_map, prev_ctr.x, new_ctr.x, prev_ctr.y)
                _create_v_tunnel(new_map, prev_ctr.y, new_ctr.y, new_ctr.x)
            else:
                _create_v_tunnel(new_map, prev_ctr.y, new_ctr.y, prev_ctr.x)
                _create_h_tunnel(new_map, prev_ctr.x, new_ctr.x, new_ctr.y)

            new_map.rooms.append(new_room)
            new_map.room_entered.append(False)
            num_rooms += 1

    # TODO: should be floodfill from one stair, make *sure* the other two are
    # connected
    for i in range(3):
        stair_pos = entry_stairs[i].dest_position
        ca_cartographer._floodfill(new_map, stair_pos.x, stair_pos.y,
            map.TERRAIN_GROUND, map.TERRAIN_FLOOR)

    _add_doors(new_map)

    for i in range(3, num_rooms - 1):
        if (new_map.rnd(1, 2) == 1):
            foe = bestiary.dvergr(new_map, new_map.rooms[i].center(), player)
            _new_equipment(foe, miscellany.handaxe())
            _new_equipment(foe, miscellany.roundshield())
            if new_map.rnd(1, 2) == 1:
                _new_item(foe, miscellany.bandage(1))
            if new_map.rnd(1, 2) == 1:
                _new_item(foe, miscellany.kumiss(1))

    foe = bestiary.tepegoz(new_map, new_ctr, player)
    _new_equipment(foe, miscellany.maguffin())
    _new_equipment(foe, miscellany.spear())
    _new_equipment(foe, miscellany.roundshield())

    new_map.initialize_fov()
    new_map.xp_visit = _dungeon_exploration
    return False  # Don't need to generate stairs in caller thanks to _link_up_stairs()
Esempio n. 20
0
#size of the map
MAP_WIDTH = 80
MAP_HEIGHT = 45

#map constants
WALL_CONST = '#'
FLOOR_CONST = '.'
ROOM_MAX_SIZE = 10
ROOM_MIN_SIZE = 6
MAX_ROOMS = 30

LIMIT_FPS = 20  #20 frames-per-second maximum

#create random number generator
rng = libtcod.random_new_from_seed(1, algo=libtcod.RNG_MT)

color_dark_wall = libtcod.lightest_grey
color_dark_ground = libtcod.lightest_grey


class Rect:
    #a rectangle on the map. used to characterize a room.
    def __init__(self, x, y, w, h):
        self.x1 = x
        self.y1 = y
        self.x2 = x + w
        self.y2 = y + h

    def center(self):
        center_x = (self.x1 + self.x2) / 2
Esempio n. 21
0
 def __init__(self, seed=12271990):
     self.rnd = libtcod.random_new_from_seed(seed, algo=libtcod.RNG_MT)
def _build_map(new_map):
    new_map.rng = libtcod.random_new_from_seed(new_map.random_seed)

    print('Seeding regions')
    for u in range(config.OUTDOOR_MAP_WIDTH / 10):
        for v in range(config.OUTDOOR_MAP_HEIGHT / 10):
            x = libtcod.random_get_int(new_map.rng, 0, 9) + u * 10
            y = libtcod.random_get_int(new_map.rng, 0, 9) + v * 10
            new_map.region_seeds.append([x, y])

    print('Growing the world-tree')
    region_tree = scipy.spatial.KDTree(new_map.region_seeds)

    new_map.region_terrain = [None for i in range(len(new_map.region_seeds))]
    new_map.region_elevations = [-1 for r in range(len(new_map.region_seeds))]
    new_map.region_entered = [False for i in range(len(new_map.region_seeds))]
    new_map.elevation_visited = [False for i in range(0,10)]

    print('Assigning regions')
    for x in range(config.OUTDOOR_MAP_WIDTH):
        for y in range(config.OUTDOOR_MAP_HEIGHT):
            (d, i) = region_tree.query([[x, y]])
            new_map.region[x][y] = i[0]
            new_map.terrain[x][y] = map.TERRAIN_GROUND

    peak = [libtcod.random_get_int(new_map.rng, int(config.OUTDOOR_MAP_WIDTH * .35), int(config.OUTDOOR_MAP_WIDTH * .65)),
            libtcod.random_get_int(new_map.rng, int(config.OUTDOOR_MAP_WIDTH * .35), int(config.OUTDOOR_MAP_WIDTH * .65))]
    print('The peak is at ' + str(peak[0]) + ', ' + str(peak[1]))

    for r in range(20):
        new_map.region_elevations[r] = 0
        new_map.region_elevations[380+r] = 0
        new_map.region_elevations[r*20] = 0
        new_map.region_elevations[r*20+19] = 0

    (d, peak_regions) = region_tree.query([peak], 3)
    for p in peak_regions[0]:
        new_map.region_elevations[p] = 9

    _interpolate_heights(new_map, peak)
    _ensure_penultimate_height(new_map, peak, region_tree)
    _extend_hills(new_map, peak)
    _debug_region_heights(new_map)

    _clump_terrain(new_map)
    _place_seaside_height(new_map)
    # TODO: level_desert() here to guarantee caravanserai is in the northeast
    # TODO: sink_quarry() here before we _mark_slopes
    # to get rid of messy after-the-fact slope fixup in dig_quarry()
    strata = _find_terrain_types(new_map)
    _debug_region_terrain(new_map)

    _mark_slopes(new_map)
    _assign_terrain(new_map)

    _make_rotunda(new_map, peak)
    compound_cartographer.make_caravanserai(new_map)
    _dig_quarry(new_map, peak)
    _make_grotto(new_map)
    _site_final_dungeon(new_map, strata)

    new_map.peak = peak
Esempio n. 23
0
#create world
nwidth = 100
nheight = 60
alivechar = '+'
deadchar = ' '
char_option = 'ascii'
speed = .1
inc = 0.01

# default generator
default = libtcod.random_get_instance()
# another random generator
my_random = libtcod.random_new()
# a random generator with a specific seed
my_determinist_random = libtcod.random_new_from_seed(0xdeadbeef)

world = World(nwidth,nheight, alivechar, deadchar, char_option, my_determinist_random)

libtcod.console_set_custom_font('oryx_tiles3.png', libtcod.FONT_TYPE_GREYSCALE | libtcod.FONT_LAYOUT_TCOD, 32, 12)
libtcod.console_init_root(nwidth, nheight, 'johnstein\'s Game of RogueLife!', False, libtcod.RENDERER_SDL)
libtcod.sys_set_fps(30)

libtcod.console_map_ascii_codes_to_font(256   , 32, 0, 5)  #map all characters in 1st row
libtcod.console_map_ascii_codes_to_font(256+32, 32, 0, 6)  #map all characters in 2nd row

mouse = libtcod.Mouse()
key = libtcod.Key()  

#initialize population
Esempio n. 24
0
def make_map(player, dungeon_level):
    """
    """
    old_map = player.current_map

    new_map = map.DungeonMap(MINE_SIZE, MINE_SIZE, dungeon_level)
    new_map.objects.append(player)
    player.current_map = new_map
    player.camera_position = algebra.Location(0, 0)
    new_map.random_seed = libtcod.random_save(0)
    new_map.rng = libtcod.random_new_from_seed(new_map.random_seed)

    old_quarry_stairs = old_map.quarry_stairs
    _link_up_stairs(new_map, old_map, old_quarry_stairs)
    _create_entries(new_map, old_quarry_stairs)
    _descend_stairs(new_map, player, old_quarry_stairs)
    _dig_some_caves(new_map, old_quarry_stairs)
    _dig_mine_tunnels(new_map)

    map_bounds = algebra.Rect(1, 1, new_map.width - 1, new_map.height - 1)
    for x in range(1, new_map.width - 1):
        for y in range(1, new_map.height - 1):
            if libtcod.random_get_float(new_map.rng, 0., 1.) < 0.2:
                new_map.terrain[x][y] = map.TERRAIN_GROUND

    ca_cartographer._generation(new_map, map_bounds, 7, 1)
    ca_cartographer._generation(new_map, map_bounds, 5, 1)

    # Redig the initial rooms because the CA can fill in the stairs
    for i in range(3):
        _create_room(new_map, new_map.rooms[i])

    for i in range(3):
        stair_pos = old_quarry_stairs[i].dest_position
        ca_cartographer._floodfill(new_map, stair_pos.x, stair_pos.y,
                                   map.TERRAIN_GROUND, map.TERRAIN_FLOOR)

    for x in range(1, new_map.width - 1):
        for y in range(1, new_map.height - 1):
            if new_map.terrain[x][y] == map.TERRAIN_GROUND:
                new_map.terrain[x][y] = map.TERRAIN_WALL

    #for x in range(0, new_map.width):
    #    new_map.terrain[x][0] = map.TERRAIN_WALL
    #    new_map.terrain[x][new_map.height-1] = map.TERRAIN_WALL
    #for y in range(0, new_map.height):
    #    new_map.terrain[0][y] = map.TERRAIN_WALL
    #    new_map.terrain[new_map.width-1][y] = map.TERRAIN_WALL

    zone_divisor = MINE_SIZE / 3
    slime_zone = new_map.rnd(0, 2)
    while True:
        undead_zone = new_map.rnd(0, 2)
        if undead_zone != slime_zone:
            break

    for r in range(3, len(new_map.rooms)):
        if new_map.rnd(1, 4) < 3:
            room = new_map.rooms[r]
            zone = room.center().x / zone_divisor
            if zone == slime_zone:
                if new_map.rnd(1, 2) == 1:
                    bestiary.slime(new_map,
                                   _find_floor_near_room(new_map,
                                                         room), player)
                    bestiary.slime(new_map,
                                   _find_floor_near_room(new_map,
                                                         room), player)
                else:
                    bestiary.jelly(new_map,
                                   _find_floor_near_room(new_map,
                                                         room), player)
            elif zone == undead_zone:
                bestiary.ghul(new_map, _find_floor_near_room(new_map, room),
                              player)
            else:
                bestiary.worm(new_map, _find_floor_near_room(new_map, room),
                              player)

    r = new_map.rnd(3, len(new_map.rooms) - 1)
    pos = new_map.rooms[r].center()
    while new_map.is_blocked_at(pos):
        pos += actions.random_direction()

    new_map.objects.insert(0,
                           Object(pos, '%', "hero's corpse", libtcod.dark_red))
    sword = miscellany.the_black_sword()
    sword.pos = pos
    new_map.objects.insert(0, sword)

    new_map.initialize_fov()
    new_map.xp_visit = _dungeon_exploration
    return False  # Don't need to generate stairs in caller thanks to _link_up_stairs()
Esempio n. 25
0
def make_final_map(player, dungeon_level):
    """
    """
    old_map = player.current_map

    new_map = map.DungeonMap(FINAL_DUNGEON_SIZE, FINAL_DUNGEON_SIZE,
                             dungeon_level)
    new_map.objects.append(player)
    player.current_map = new_map
    player.camera_position = algebra.Location(0, 0)
    new_map.random_seed = libtcod.random_save(0)
    new_map.rng = libtcod.random_new_from_seed(new_map.random_seed)

    entry_stairs = old_map.dungeon_stairs
    mine_cartographer._link_up_stairs(new_map, old_map, entry_stairs)
    mine_cartographer._create_entries(new_map, entry_stairs)
    mine_cartographer._descend_stairs(new_map, player, entry_stairs)

    num_rooms = 3
    for r in range(3, MAX_ROOMS):
        w = libtcod.random_get_int(new_map.rng, ROOM_MIN_SIZE, ROOM_MAX_SIZE)
        h = libtcod.random_get_int(new_map.rng, ROOM_MIN_SIZE, ROOM_MAX_SIZE)
        x = libtcod.random_get_int(new_map.rng, 0, new_map.width - w - 1)
        y = libtcod.random_get_int(new_map.rng, 0, new_map.height - h - 1)

        new_room = map.Room(x, y, w, h)

        failed = False
        for other_room in new_map.rooms:
            if new_room.intersect(other_room):
                failed = True
                break

        if not failed:
            # There are no intersections, so this room is valid.
            _create_room(new_map, new_room, num_rooms)
            new_ctr = new_room.center()
            prev_ctr = new_map.rooms[num_rooms - 3].center()

            if libtcod.random_get_int(new_map.rng, 0, 1) == 1:
                _create_h_tunnel(new_map, prev_ctr.x, new_ctr.x, prev_ctr.y)
                _create_v_tunnel(new_map, prev_ctr.y, new_ctr.y, new_ctr.x)
            else:
                _create_v_tunnel(new_map, prev_ctr.y, new_ctr.y, prev_ctr.x)
                _create_h_tunnel(new_map, prev_ctr.x, new_ctr.x, new_ctr.y)

            new_map.rooms.append(new_room)
            new_map.room_entered.append(False)
            num_rooms += 1

    # TODO: should be floodfill from one stair, make *sure* the other two are
    # connected
    for i in range(3):
        stair_pos = entry_stairs[i].dest_position
        ca_cartographer._floodfill(new_map, stair_pos.x, stair_pos.y,
                                   map.TERRAIN_GROUND, map.TERRAIN_FLOOR)

    _add_doors(new_map)

    for i in range(3, num_rooms - 1):
        if (new_map.rnd(1, 2) == 1):
            foe = bestiary.dvergr(new_map, new_map.rooms[i].center(), player)
            _new_equipment(foe, miscellany.handaxe())
            _new_equipment(foe, miscellany.roundshield())
            if new_map.rnd(1, 2) == 1:
                _new_item(foe, miscellany.bandage(1))
            if new_map.rnd(1, 2) == 1:
                _new_item(foe, miscellany.kumiss(1))

    foe = bestiary.tepegoz(new_map, new_ctr, player)
    _new_equipment(foe, miscellany.maguffin())
    _new_equipment(foe, miscellany.spear())
    _new_equipment(foe, miscellany.roundshield())

    new_map.initialize_fov()
    new_map.xp_visit = _dungeon_exploration
    return False  # Don't need to generate stairs in caller thanks to _link_up_stairs()