def get_game_variables(constants): # Player creation fighter_component = Fighter(hp=100, defense=1, power=3) inventory_component = Inventory(26) equipment_component = Equipment() level = Level(level_up_base=constants['level_up_base'], level_up_factor=constants['level_up_factor']) player = Entity(0, 0, '@', libtcod.white, 'Player', blocks=True, render_order=RenderOrder.ACTOR, fighter=fighter_component, inventory=inventory_component, level=level, equipment=equipment_component) entities = [player] starter_weapon = dagger(0, 0) player.inventory.add_item(starter_weapon) player.equipment.toggle_equip(starter_weapon) # Map creation game_map = GameMap(constants['map_width'], constants['map_height']) game_map.make_map(constants['max_rooms'], constants['room_min_size'], constants['room_max_size'], constants['map_width'], constants['map_height'], player, entities) message_log = MessageLog(constants['message_x'], constants['message_width'], constants['message_height']) game_state = GameStates.PLAYERS_TURN return player, entities, game_map, message_log, game_state
def leather_pants(x, y): equippable_component = Equippable(EquipmentSlots.LEGS, defense_bonus=1) return Entity(x, y, 'l', libtcod.dark_amber, 'Leather pants', equippable=equippable_component, render_order=RenderOrder.ITEM)
def leather_helmet(x, y): equippable_component = Equippable(EquipmentSlots.HEAD, defense_bonus=1) return Entity(x, y, 'h', libtcod.dark_amber, 'Leather helmet', equippable=equippable_component, render_order=RenderOrder.ITEM)
def sword(x, y): equippable_component = Equippable(EquipmentSlots.MAIN_HAND, power_bonus=3) return Entity(x, y, '/', libtcod.sky, 'Sword', equippable=equippable_component, render_order=RenderOrder.ITEM)
def axe(x, y): equippable_component = Equippable(EquipmentSlots.MAIN_HAND, power_bonus=4) return Entity(x, y, 'p', libtcod.sky, 'Axe', equippable=equippable_component, render_order=RenderOrder.ITEM)
def dagger(x, y): equippable_component = Equippable(EquipmentSlots.MAIN_HAND, power_bonus=2) return Entity(0, 0, '-', libtcod.sky, 'Dagger', equippable=equippable_component, render_order=RenderOrder.ITEM)
def shield(x, y): equippable_component = Equippable(EquipmentSlots.OFF_HAND, defense_bonus=1) return Entity(x, y, '[', libtcod.darker_orange, 'Shield', equippable=equippable_component, render_order=RenderOrder.ITEM)
def iron_ring_force(x, y): equippable_component = Equippable(EquipmentSlots.FINGER, power_bonus=2) return Entity(x, y, 'o', libtcod.darker_orange, 'Iron ring of force', equippable=equippable_component, render_order=RenderOrder.ITEM)
def iron_ring_life(x, y): equippable_component = Equippable(EquipmentSlots.FINGER, max_hp_bonus=15) return Entity(x, y, 'o', libtcod.darker_orange, 'Iron ring of life', equippable=equippable_component, render_order=RenderOrder.ITEM)
def lightning_scroll(x, y): item_component = Item(use_function=cast_lightning, damage=20, maximum_range=5) return Entity(x, y, '#', libtcod.yellow, 'Lightning Scroll', render_order=RenderOrder.ITEM, item=item_component)
def leather_armor(x, y): equippable_component = Equippable(EquipmentSlots.BODY, defense_bonus=2, max_hp_bonus=25) return Entity(x, y, 'a', libtcod.dark_amber, 'Leather armor', equippable=equippable_component, render_order=RenderOrder.ITEM)
def iron_armor(x, y): equippable_component = Equippable(EquipmentSlots.BODY, defense_bonus=4, max_hp_bonus=50) return Entity(x, y, 'a', libtcod.dark_amber, 'Iron armor', equippable=equippable_component, render_order=RenderOrder.ITEM)
def create_troll(x, y): fighter_component = Fighter(hp=30, defense=2, power=8, xp=100) ai_component = BasicMonster() return Entity(x, y, 'T', libtcod.darker_green, 'Troll', True, render_order=RenderOrder.ACTOR, fighter=fighter_component, ai=ai_component)
def create_orc(x, y): fighter_component = Fighter(hp=20, defense=0, power=4, xp=35) ai_component = BasicMonster() return Entity(x, y, 'o', libtcod.desaturated_green, 'Orc', True, render_order=RenderOrder.ACTOR, fighter=fighter_component, ai=ai_component)
def confusion_scroll(x, y): item_component = Item( use_function=cast_confuse, targeting=True, targeting_message=Message( 'Left-click an enemy to confuse it, or right-click to cancel.', libtcod.light_cyan)) return Entity(x, y, '#', libtcod.light_cyan, 'Confusion scroll', render_order=RenderOrder.ITEM, item=item_component)
def fireball_scroll(x, y): item_component = Item( use_function=cast_fireball, targeting=True, targeting_message=Message( 'Left-click a target tile for the fireball, or right-click to cancel.', libtcod.light_red), damage=12, radius=3) return Entity(x, y, '#', libtcod.red, 'Fireball Scroll', render_order=RenderOrder.ITEM, item=item_component)
def make_map(self, max_rooms, room_min_size, room_max_size, map_width, map_height, player, entities): rooms = [] num_rooms = 0 # Tracks room centers center_of_last_room_x = None center_of_last_room_y = None for r in range(max_rooms): r # r is here to stop linting errors # random width and height w = randint(room_min_size, room_max_size) h = randint(room_min_size, room_max_size) # random position without going out of the boundaries of the map x = randint(0, map_width - w - 1) y = randint(0, map_height - h - 1) # "Rect" class makes rectangles easier to work with new_room = Rect(x, y, w, h) # run through the other rooms and see if they intersect with this one for other_room in rooms: if new_room.intersect(other_room): break else: # this means there are no intersections, so this room is valid # "paint" it to the map's tiles self.create_room(new_room) # center coordinates of new room (new_x, new_y) = new_room.center() center_of_last_room_x = new_x center_of_last_room_y = new_y if num_rooms == 0: # this is the first room, where the player starts at player.x = new_x player.y = new_y else: # all rooms after the first: # connect it to the previous room with a tunnel # center coordinates of previous room (prev_x, prev_y) = rooms[num_rooms - 1].center() # flip a coin (random number that is either 0 or 1) if randint(0, 1) == 1: # first move horizontally, then vertically self.create_h_tunnel(prev_x, new_x, prev_y) self.create_v_tunnel(prev_y, new_y, new_x) else: # first move vertically, then horizontally self.create_v_tunnel(prev_y, new_y, prev_x) self.create_h_tunnel(prev_x, new_x, new_y) # finally, add monsters & append the new room to the list self.place_entities(new_room, entities) rooms.append(new_room) num_rooms += 1 stairs_component = Stairs(self.dungeon_level + 1) down_stairs = Entity(center_of_last_room_x, center_of_last_room_y, '>', libtcod.white, 'Stairs', render_order=RenderOrder.STAIRS, stairs=stairs_component) entities.append(down_stairs)
def healing_potion(x, y): # Healing potion item_component = Item(use_function=heal, amount=40) return Entity(x, y, '!', libtcod.violet, 'Healing Potion', render_order=RenderOrder.ITEM, item=item_component)