Esempio n. 1
0
    def make_map(self):
        '''Generates the map.'''

        self.map = [[Tile(True) for y in range(MAP_HEIGHT)] for x in range(MAP_WIDTH)]

        # Generate random map
        rooms = []
        room_count = 0

        b_fighter = Fighter(hp=10, defense=5, power=8, death_func=player_death)
        self.player = Object(self.con, self, 1, 1, '@', "Player",
                    libtcod.blue, blocks=True, fighter=b_fighter)

        for r in range(MAX_ROOMS):
            w = libtcod.random_get_int(0, MIN_ROOM_SIZE, MAX_ROOM_SIZE)
            h = libtcod.random_get_int(0, MIN_ROOM_SIZE, MAX_ROOM_SIZE)
            # Random 'position'
            x = libtcod.random_get_int(0, 0, MAP_WIDTH - w - 1)
            y = libtcod.random_get_int(0, 0, MAP_HEIGHT - h - 1)

            new_room = Rect(self.map, x, y, w, h)
            new_room.create_room()

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

            if not failed:
                # No intersections, can safely draw room
                new_room.create_room()
                (newx,newy) = new_room.center()

                if room_count == 0:
                    # Player starts in the center of the first room
                    self.player.x = newx
                    self.player.y = newy

                else:
                    # Connect with previous room's center
                    (px,py) = rooms[room_count-1].center()
                    if libtcod.random_get_int(0, 0, 1) == 1:
                        new_room.create_h_tunnel(px, newx, py)
                        new_room.create_v_tunnel(py, newy, newx)
                    else:
                        new_room.create_v_tunnel(py, newy, px)
                        new_room.create_h_tunnel(px, newx, newy)

                self.insert_objects(new_room)
                rooms.append(new_room)
                room_count += 1

        self.object_list.append(self.player)

        self.fov_map = libtcod.map_new(MAP_WIDTH, MAP_HEIGHT)
        for y in range(MAP_HEIGHT):
            for x in range(MAP_WIDTH):
                libtcod.map_set_properties(self.fov_map, x, y, not
                        self.map[x][y].blocked, not self.map[x][y].block_sight)
Esempio n. 2
0
    def __init__(self, cols, rows):
        self.f_color = lt.light_amber
        self.f_color_explored = lt.blue
        self.b_color = lt.darkest_amber
        self.b_color_explored = lt.darker_blue

        self.blocked = [[True for x in xrange(cols)] for y in xrange(rows)]
        if DEBUG:
            self.explored = [[True for x in xrange(cols)] for y in xrange(rows)]
        else:
            self.explored = [[False for x in xrange(cols)] for y in xrange(rows)]

        # Create rooms
        rooms = []

        for room in xrange(10):
            w = lt.random_get_int(0, 8, 25)
            h = lt.random_get_int(0, 8, 25)
            col = lt.random_get_int(0, 0, cols - w - 1)
            row = lt.random_get_int(0, 0, rows - h - 1)
            new_room = Rect_Room(col, row, w, h)
            # Check for intersections.
            failed = False
            for other in rooms:
                if new_room.intersect(other):
                    failed = True
                    break
            # Carve out new room.
            if not failed:
                for col in range(new_room.col1 + 1, new_room.col2):
                    for row in range(new_room.row1 + 1, new_room.row2):
                        self.blocked[row][col] = False
                # Create tunnel to previous room.
                if len(rooms) != 0:
                    (new_col, new_row) = new_room.center()
                    (prev_col, prev_row) = rooms[-1].center()
                    if lt.random_get_int(0, 0, 1) == 1:
                        self.horizontal_tunnel(prev_col, new_col, prev_row)
                        self.vertical_tunnel(prev_row, new_row, new_col)
                    else:
                        self.vertical_tunnel(prev_row, new_row, prev_col)
                        self.horizontal_tunnel(prev_col, new_col, new_row)
                rooms.append(new_room)

        # Create console
        self.con = lt.console_new(cols, rows)

        # Create FOV map and cache (cache being for the currently dumb algorithm).
        self.fov = lt.map_new(cols, rows)
        for col in xrange(cols):
            for row in xrange(rows):
                lt.map_set_properties(self.fov, col, row, not self.blocked[row][col], True)
        self.fov_cache = lt.map_new(cols, rows)
        lt.map_copy(self.fov, self.fov_cache)
Esempio n. 3
0
 def take_turn(self):
     mob = self.owner
     if libtcod.map_is_in_fov(self.owner.map.fov_map, mob.x, mob.y):
         # Moves towards the player
         if mob.distance_to(self.owner.map.player) >= 2:
             mob.move_towards(self.owner.map.player.x,
                     self.owner.map.player.y)
             # Mob moving towards player, random growls
             chance = libtcod.random_get_int(0, 1, 100)
             if chance <= 20:
                 sfx.play('zombie_a')
             elif chance <= 40:
                 sfx.play('zombie_b')
             elif chance <= 60:
                 sfx.play('zombie_c')
         elif self.owner.map.player.fighter.hp > 0:
             mob.fighter.attack(self.owner.map.player)
Esempio n. 4
0
    def take_damage(self, damage):
        '''Applies damage to the fighter.'''

        if damage > 0:
            self.hp -= damage
            if self.owner.ai:
                # It's a zombie, let's randomly choose a hit sfx
                chance = libtcod.random_get_int(0, 1, 100)
                if chance <= 50:
                    sfx.play('zombie_hurt_a')
                elif chance <= 100:
                    sfx.play('zombie_hurt_b')


        if self.hp <= 0:
            func = self.death_func
            if func is not None:
                func(self.owner)
Esempio n. 5
0
    def insert_objects(self, room):
        '''Randomly inserts monsters or items into the room.'''

        mob_count = libtcod.random_get_int(0, 0, MAX_ROOM_MOBS)
        for i in range(mob_count):
            x = libtcod.random_get_int(0, room.x1+1, room.x2-1)
            y = libtcod.random_get_int(0, room.y1+1, room.y2-1)
            mob_percent = libtcod.random_get_int(0, 0, 100)

            if not self.is_blocked(x, y):
                if mob_percent < 80:
                    # Zombie
                    b_zombie = Fighter(hp=10, defense=5, power=7,
                            death_func=zombie_a_death)
                    aic = BasicMob()
                    mob = Object(self.con, self, x, y, 'z', zombie_title(1),
                            libtcod.green, True, fighter=b_zombie, ai=aic)
                elif mob_percent < 98:
                    # Zombie Leader
                    m_zombie = Fighter(hp=15, defense=7, power=7,
                            death_func=zombie_b_death)
                    aic = BasicMob()
                    mob = Object(self.con, self, x, y, 'z', zombie_title(2),
                            libtcod.red, True, fighter=m_zombie, ai=aic)
                else:
                    # Zombie Boss
                    a_zombie = Fighter(hp=20, defense=10, power=12,
                            death_func=zombie_c_death)
                    aic = BasicMob()
                    mob = Object(self.con, self, x, y, 'Z', zombie_title(3),
                            libtcod.violet, True, fighter=a_zombie, ai=aic)
                self.object_list.append(mob)

        item_count = libtcod.random_get_int(0, 0, MAX_ROOM_ITEMS)
        for i in range(item_count):
            x = libtcod.random_get_int(0, room.x1+1, room.x2-1)
            y = libtcod.random_get_int(0, room.y1+1, room.y2-1)

            if not self.is_blocked(x, y):
                # we place the items
                item = Object(self.con, self, x, y, 'M', 'Medkit', libtcod.orange)
                self.object_list.append(item)
                item.send_to_back()