コード例 #1
0
    def _update_menu_items(self):
        items = self.player.inventory.items_of_equipment_type(
            self.equipment_slot.equipment_type)
        self.menu_items = []
        for item in items:
            reequip_function = item.reequip_action.delayed_act(
                source_entity=self.player,
                target_entity=self.player,
                equipment_slot=self.equipment_slot)
            stack_pop_function = BackToGameFunction(self._state_stack)
            functions = [reequip_function, stack_pop_function]
            self.menu_items.append(
                MenuOptionWithSymbols(item.description.name,
                                      item.graphic_char,
                                      item.graphic_char,
                                      functions,
                                      payload=item))

        unequip_function = equipactions.UnequipAction().delayed_act(
            source_entity=self.player,
            target_entity=self.player,
            equipment_slot=self.equipment_slot)
        stack_pop_function = BackToGameFunction(self._state_stack)
        unequip_functions = [unequip_function, stack_pop_function]
        none_item_graphic = graphic.GraphicChar(None, colors.NOT_EQUIPPED_FG,
                                                self.equipment_slot.icon)
        self.menu_items.append(
            MenuOptionWithSymbols("- None -", none_item_graphic,
                                  none_item_graphic, unequip_functions))
        #if self.selected_payload_callback.description is None:
        #self.call_payload_callback()

        self._item_stack_panel.vertical_space = 1 if len(
            items) * 2 + 2 <= inventory.ITEM_CAPACITY else 0
コード例 #2
0
def game_over_screen(state_stack):
    game_over_stack_panel = gui.StackPanelVertical((0, 0), alignment=gui.StackPanelVertical.ALIGN_CENTER)
    red_line = gui.HorizontalLine(graphic.GraphicChar(None, colors.RED, icon.H_LINE), settings.SCREEN_WIDTH + 1)
    game_over_text = gui.TextBox("YOU DIED", (0, 0), colors.RED)
    insult_text = gui.TextBox("Like a bitch.", (0, 0), colors.DARK_BROWN)

    continue_option = \
        menu.MenuOption("Press Enter to Accept Your Fate...",
                        [lambda: state_stack.pop_to_main_menu()])

    continue_menu = menu.StaticMenu((0, 0), [continue_option], state_stack,
                                    margin=style.menu_theme.margin, may_escape=False)

    short_vspace = gui.VerticalSpace(7)
    long_vspace = gui.VerticalSpace(settings.SCREEN_HEIGHT - 22)

    game_over_stack_panel.append(short_vspace)
    game_over_stack_panel.append(red_line)
    game_over_stack_panel.append(game_over_text)
    game_over_stack_panel.append(red_line)
    game_over_stack_panel.append(insult_text)
    game_over_stack_panel.append(long_vspace)
    game_over_stack_panel.append(continue_menu)

    grayout_rect = gui.RectangleChangeColor(rectfactory.full_screen_rect(),
                                            colors.BLACK, colors.DARK_PURPLE)

    ui_elements = [grayout_rect, game_over_stack_panel]
    ui_state = state.UIState(gui.UIElementList(ui_elements))
    return ui_state
コード例 #3
0
def victory_screen(state_stack):
    victory_stack_panel = gui.StackPanelVertical((0, 0), alignment=gui.StackPanelVertical.ALIGN_CENTER)
    line = gui.HorizontalLine(graphic.GraphicChar(None, colors.YELLOW, icon.H_LINE), settings.SCREEN_WIDTH + 1)
    victory_text = gui.TextBox("A WINNER IS YOU", (0, 0), colors.WHITE)
    ironic_text = \
        gui.TextBox("Good job! No seriously, I bet it was real hard...",
                    (0, 0), colors.YELLOW_D)

    continue_option = \
        menu.MenuOption("Press Enter to Continue...", [lambda: state_stack.pop_to_main_menu()])

    continue_menu = menu.StaticMenu((0, 0), [continue_option], state_stack,
                                    margin=style.menu_theme.margin, may_escape=False)

    short_vspace = gui.VerticalSpace(7)
    long_vspace = gui.VerticalSpace(settings.SCREEN_HEIGHT - 22)

    victory_stack_panel.append(short_vspace)
    victory_stack_panel.append(line)
    victory_stack_panel.append(victory_text)
    victory_stack_panel.append(line)
    victory_stack_panel.append(ironic_text)
    victory_stack_panel.append(long_vspace)
    victory_stack_panel.append(continue_menu)

    grayout_rect = gui.RectangleChangeColor(rectfactory.full_screen_rect(), colors.DARK_BROWN, colors.YELLOW_D)

    ui_elements = [grayout_rect, victory_stack_panel]
    ui_state = state.UIState(gui.UIElementList(ui_elements))
    return ui_state
コード例 #4
0
def new_player_weapon_table(player, width):
    equipment = player.equipment
    if equipment.slot_is_equiped(EquipmentSlots.MELEE_WEAPON):
        melee_graphic = equipment.get(EquipmentSlots.MELEE_WEAPON).graphic_char
    else:
        melee_graphic = graphic.GraphicChar(None, colors.WHITE, icon.BIG_CENTER_DOT)
    melee_damage = str(player.melee_attacker.min_damage) + "-" + str(player.melee_attacker.max_damage)
    melee_accuracy = player.melee_attacker.accuracy
    melee_crit_chance = "{:.0f}".format(player.melee_attacker.crit_chance * 100) + "%"

    if equipment.slot_is_equiped(EquipmentSlots.RANGED_WEAPON):
        range_graphic = equipment.get(EquipmentSlots.RANGED_WEAPON).graphic_char
    else:
        range_graphic = graphic.GraphicChar(None, colors.GRAY, icon.STONE)
    range_damage = str(player.ranged_attacker.min_damage) + "-" + str(player.ranged_attacker.max_damage)
    range_accuracy = player.ranged_attacker.accuracy
    range_crit_chance = "{:.0f}".format(player.ranged_attacker.crit_chance * 100) + "%"

    value_width = 3
    text_box_margin = (0, 0)
    heading_stack_panel = gui.StackPanelHorizontal((0, 0), alignment=gui.StackPanelHorizontal.ALIGN_TOP,
                                                   horizontal_space=0)
    heading_stack_panel.append(gui.HorizontalSpace(6))
    heading_stack_panel.append(gui.SymbolUIElement((0, 0), melee_graphic))
    heading_stack_panel.append(gui.HorizontalSpace(3))
    heading_stack_panel.append(gui.SymbolUIElement((0, 0), range_graphic))
    damage_text_box = gui.TextBox("Dmg " + str(melee_damage).rjust(value_width) +
                                  " " + str(range_damage).rjust(value_width),
                                  text_box_margin, colors.WHITE)
    hit_text_box = gui.TextBox("Hit " + str(melee_accuracy).rjust(value_width) +
                               " " + str(range_accuracy).rjust(value_width),
                               text_box_margin, colors.YELLOW)
    crit_chance_text_box = gui.TextBox("Cri " + str(melee_crit_chance).rjust(value_width) +
                                       " " + str(range_crit_chance).rjust(value_width),
                                       text_box_margin, colors.RED)

    status_stack_panel = gui.StackPanelVertical((0, 0), alignment=gui.StackPanelVertical.ALIGN_LEFT,
                                                vertical_space=0)
    status_stack_panel.append(heading_stack_panel)
    status_stack_panel.append(gui.VerticalSpace(1))
    status_stack_panel.append(damage_text_box)
    status_stack_panel.append(hit_text_box)
    status_stack_panel.append(crit_chance_text_box)
    return status_stack_panel
コード例 #5
0
def get_save_quit_menu(player, state_stack):
    options = []
    game_state = player.game_state.value
    exit_menu_function = menu.BackToGameFunction(state_stack)
    save_and_quit_graphic_active = graphic.GraphicChar(None, colors.WHITE, icon.GUNSLINGER_THIN)
    save_and_quit_graphic_inactive = graphic.GraphicChar(None, colors.GRAY, icon.GUNSLINGER_THIN)
    options.append(menu.MenuOptionWithSymbols("Save and Quit", save_and_quit_graphic_active,
                                              save_and_quit_graphic_inactive,
                                              [lambda: save.save(game_state), exit_menu_function,
                                               game_state.current_stack.pop,
                                               (lambda: player.actor.add_energy_spent(gametime.single_turn))]))

    give_up_graphic_active = graphic.GraphicChar(None, colors.WHITE, icon.SKULL)
    give_up_graphic_inactive = graphic.GraphicChar(None, colors.GRAY, icon.SKULL)
    options.append(menu.MenuOptionWithSymbols("Give Up", give_up_graphic_active, give_up_graphic_inactive,
                                              [player.health_modifier.kill, exit_menu_function,
                                               (lambda: player.actor.add_energy_spent(gametime.single_turn))]))

    return get_menu_with_options(options, state_stack, 6, 5)
コード例 #6
0
def sacrifice_menu(player, powers, post_power_gain_function):
    game_state = player.game_state.value
    state_stack = game_state.menu_prompt_stack
    context_options = []
    stack_pop_function = menu.BackToGameFunction(state_stack)
    width = 24

    for power in powers:
        power_caption = power.description.name + str(power.buy_cost).rjust(width - len(power.description.name))
        power_option = menu.MenuOption(power_caption, [lambda p=power: player.set_child(p),
                                                       lambda p=power: p.on_power_gained(),
                                                       lambda p=power: sacrifice.sacrifice_health(player, p.buy_cost),
                                                       lambda: player.actor.add_energy_spent(gametime.single_turn),
                                                       post_power_gain_function,
                                                       stack_pop_function],
                                       (lambda: player.health.hp.value > power.buy_cost), payload=power)
        context_options.append(power_option)

    cancel_option = menu.MenuOption("Cancel", [stack_pop_function], (lambda: True))
    context_options.append(cancel_option)

    tmp = (0, 0)
    menu_stack_panel = gui.StackPanelVertical(tmp, style.menu_theme.margin, vertical_space=0,
                                              alignment=gui.StackPanelVertical.ALIGN_CENTER)

    heading_stack_panel = gui.StackPanelHorizontal((0, 0), (0, 0), horizontal_space=2)
    menu_stack_panel.append(heading_stack_panel)
    if any(powers):
        power_caption = "Power" + str("Cost").rjust(width - len("Cost   "))
        heading_stack_panel.append(gui.TextBox(power_caption, (1, 0), colors.GRAY))
        heading_stack_panel.append(gui.SymbolUIElement((0, 0), graphic.GraphicChar(colors.DARK_BLUE, colors.HP_BAR_FULL, icon.HEALTH_STAT)))
        menu_stack_panel.append(gui.VerticalSpace(2))
    else:
        power_caption = "There are no more powers."
        menu_stack_panel.append(gui.VerticalSpace(4))
        heading_stack_panel.append(gui.TextBox(power_caption, (1, 0), colors.GRAY))

    item_description_card = gui.new_item_description_card()
    resulting_menu = menu.StaticMenu((0, 0), context_options, state_stack, selected_payload_callback=(lambda item: item_description_card.set_item(item)))
    menu_stack_panel.append(resulting_menu)

    context_menu_rect = rectfactory.center_of_screen_rect(max(menu_stack_panel.total_width, 24),
                                                          max(menu_stack_panel.total_height, 6))
    menu_stack_panel.offset = context_menu_rect.top_left
    background_rect = get_menu_background(context_menu_rect, style.sacrifice_menu_theme.rect_style)

    dock = gui.UIDock(rectfactory.full_screen_rect())
    dock.bottom = item_description_card

    ui_elements = [background_rect, menu_stack_panel, dock]
    ui_state = state.UIState(gui.UIElementList(ui_elements))
    return ui_state
コード例 #7
0
def _main_menu(ui_state, state_stack, player_name_func, game_state_factory, test_game_state_factory):
    """
    Creates the first menu of the game.
    """
    continue_game_function = lambda: ui_state.current_stack.push(save.load_first_game())
    start_game_function = lambda: ui_state.current_stack.push(game_state_factory(player_name_func()))
    start_test_game_function = lambda: ui_state.current_stack.push(test_game_state_factory(player_name_func()))
    quit_game_function = lambda: ui_state.current_stack.pop()
    dungeon_visualizer_function = \
        lambda: ui_state.current_stack.push(dungeoncreatorvisualizer.DungeonCreatorVisualizer())

    no_icon = graphic.GraphicChar(None, colors.BLACK, " ")
    gun_icon = graphic.GraphicChar(None, colors.WHITE, icon.GUN)
    menu_items = []

    continue_game_option = menu.MenuOptionWithSymbols("Continue", gun_icon, no_icon, [continue_game_function],
                                                      save.is_there_a_saved_game)
    menu_items.append(continue_game_option)

    start_game_option = \
        menu.MenuOptionWithSymbols("New Game", gun_icon, no_icon, [start_game_function])
    menu_items.append(start_game_option)

    if settings.DEV_MODE_FLAG:
        start_test_game_option = \
            menu.MenuOptionWithSymbols("Test Dungeon", gun_icon, no_icon, [start_test_game_function])
        menu_items.append(start_test_game_option)

        dungeon_creator_option = \
            menu.MenuOptionWithSymbols("Dungeon Generator", gun_icon, no_icon, [dungeon_visualizer_function])
        menu_items.append(dungeon_creator_option)

    quit_option = menu.MenuOptionWithSymbols("Quit", gun_icon, no_icon, [quit_game_function])
    menu_items.append(quit_option)

    temp_position = (0, 0)
    return menu.StaticMenu(temp_position, menu_items, state_stack, margin=style.menu_theme.margin,
                           vertical_space=1, vi_keys_accepted=False)
コード例 #8
0
def inventory_menu(player, state_stack):
    menu_stack_panel = get_item_menu_stack_panel_template("Inventory",
                                                          graphic.GraphicChar(None, colors.INVENTORY_HEADING,
                                                                              icon.INVENTORY_ICON))
    item_description_card = gui.new_item_description_card()
    menu_items = []
    for item in player.inventory.get_items_sorted():
        menu_option = _get_item_action_menu_option(item, player, state_stack)
        menu_items.append(menu_option)

    inventory_menu = menu.StaticMenu((0, 1), menu_items, state_stack, (0, 0), vertical_space=0,
                                     selected_payload_callback=(lambda item: item_description_card.set_item(item)))
    menu_stack_panel.append(inventory_menu)

    return _get_item_menu_composition(item_description_card, menu_stack_panel)
コード例 #9
0
def filtered_by_action_item_menu(player, state_stack, item_action_tag, heading_text):
    menu_stack_panel = get_item_menu_stack_panel_template(heading_text,
                                                          graphic.GraphicChar(None,
                                                                              colors.INVENTORY_HEADING,
                                                                              icon.INVENTORY_ICON))
    item_description_card = gui.new_item_description_card()
    stack_pop_function = menu.BackToGameFunction(state_stack)
    menu_items = []
    for item in player.inventory.get_items_sorted():
        if len(item.get_children_with_tag(item_action_tag)) > 0:
            item_action = item.get_children_with_tag(item_action_tag)[0]
            item_action_option = _get_item_action_option(item, item_action, player, stack_pop_function)
            menu_items.append(item_action_option)

    action_menu = menu.StaticMenu((0, 1), menu_items, state_stack,
                                  (0, 0), vertical_space=0, selected_payload_callback=(lambda item: item_description_card.set_item(item)))
    menu_stack_panel.append(action_menu)
    return _get_item_menu_composition(item_description_card, menu_stack_panel)
コード例 #10
0
def item_type_menu_callback_menu(player, state_stack, item_type, heading_text, item_callback,
                                 can_callback_activate=(lambda: True)):
    menu_stack_panel = get_item_menu_stack_panel_template(heading_text,
                                                          graphic.GraphicChar(None,
                                                                              colors.INVENTORY_HEADING,
                                                                              icon.INVENTORY_ICON))
    item_description_card = gui.new_item_description_card()
    stack_pop_function = menu.BackToGameFunction(state_stack)
    menu_items = []
    for item in player.inventory.get_items_sorted():
        if item.item_type.value == item_type:
            item_action_option = _get_item_callback_option(item, item_callback, can_callback_activate,
                                                           player, stack_pop_function)
            menu_items.append(item_action_option)

    _equip_menu = menu.StaticMenu((0, 1), menu_items, state_stack, (0, 0), vertical_space=0,
                                  selected_payload_callback=(lambda item: item_description_card.set_item(item)))
    menu_stack_panel.append(_equip_menu)
    return _get_item_menu_composition(item_description_card, menu_stack_panel)
コード例 #11
0
 def _update_menu_items(self):
     self.menu_items = []
     for slot in equipment.EquipmentSlots.ALL:
         slot_menu = menufactory.equipment_slot_menu(
             self.player, slot, self._state_stack)
         option_func = menufactory.DelayedStatePush(self._state_stack,
                                                    slot_menu)
         item_in_slot = self.player.equipment.get(slot)
         if item_in_slot is None:
             item_name = "-"
             item_graphic = graphic.GraphicChar(None,
                                                colors.NOT_EQUIPPED_FG,
                                                slot.icon)
         else:
             item_name = item_in_slot.description.name
             item_graphic = item_in_slot.graphic_char
         self.menu_items.append(
             MenuOptionWithSymbols(item_name,
                                   item_graphic,
                                   item_graphic, [option_func],
                                   payload=item_in_slot))
コード例 #12
0
def title_screen(state_stack, game_state_factory, test_game_state_factory):

    bg_color = colors.DARKNESS
    logo_fg = colors.RED

    _ = graphic.GraphicChar(bg_color, bg_color, " ")
    x = graphic.GraphicChar(logo_fg, logo_fg, " ")
    d = graphic.GraphicChar(bg_color, logo_fg, icon.DIAGONAL_SE)
    b = graphic.GraphicChar(bg_color, logo_fg, icon.DIAGONAL_SW)
    p = graphic.GraphicChar(logo_fg, bg_color, icon.DIAGONAL_SE)
    q = graphic.GraphicChar(logo_fg, bg_color, icon.DIAGONAL_SW)


    graphic_matrix = [
    [_,_,_,x,x,x,_,_,x,_,x,_,_,x,x,x,_,_,_,_,_,_,_,x,_,_,_,_,d,x,b,_,_,d,x,p,_,_,x,x,x,_,_],
    [_,_,_,_,x,_,_,_,x,_,x,_,_,x,_,_,_,_,_,_,_,_,_,x,_,_,_,_,x,_,x,_,_,x,_,_,_,_,_,x,_,_,_],
    [_,_,_,_,x,_,_,_,x,x,x,_,_,x,x,_,_,_,_,_,_,_,_,x,_,_,_,_,x,x,x,_,_,q,x,b,_,_,_,x,_,_,_],
    [_,_,_,_,x,_,_,_,x,_,x,_,_,x,_,_,_,_,_,_,_,_,_,x,_,_,_,_,x,_,x,_,_,_,_,x,_,_,_,x,_,_,_],
    [_,_,_,_,x,_,_,_,x,_,x,_,_,x,x,x,_,_,_,_,_,_,_,x,x,x,_,_,x,_,x,_,_,x,x,p,_,_,_,x,_,_,_],
    [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_],
    [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_],
    [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_],
    [q,x,x,x,x,x,x,b,_,_,d,x,x,x,x,x,b,_,_,d,x,x,x,x,x,b,_,q,x,x,p,_,q,x,x,p,q,x,x,x,x,x,x],
    [_,x,x,_,_,q,x,x,_,_,x,x,p,_,q,x,x,_,_,x,x,p,_,q,x,x,_,_,x,x,_,_,_,x,x,_,_,x,x,_,_,_,q],
    [_,x,x,_,_,_,x,x,_,_,x,x,_,_,_,x,x,_,_,x,x,_,_,_,_,_,_,_,x,x,_,_,_,x,x,_,_,x,x,_,_,_,_],
    [_,x,x,_,_,d,x,x,_,_,x,x,_,_,_,x,x,_,_,x,x,_,_,_,_,_,_,_,x,x,_,_,_,x,x,_,_,x,x,_,_,_,_],
    [_,x,x,x,x,x,x,p,_,_,x,x,_,_,_,x,x,_,_,x,x,_,_,x,x,x,p,_,x,x,_,_,_,x,x,_,_,x,x,x,x,p,_],
    [_,x,x,q,x,b,_,_,_,_,x,x,_,_,_,x,x,_,_,x,x,_,_,_,x,x,_,_,x,x,_,_,_,x,x,_,_,x,x,_,_,_,_],
    [_,x,x,_,q,x,b,_,_,_,x,x,_,_,_,x,x,_,_,x,x,_,_,_,x,x,_,_,x,x,_,_,_,x,x,_,_,x,x,_,_,_,_],
    [_,x,x,_,_,q,x,b,_,_,x,x,b,_,d,x,x,_,_,x,x,b,_,d,x,x,_,_,x,x,b,_,d,x,x,_,_,x,x,_,_,_,d],
    [d,x,x,b,_,_,x,x,b,_,q,x,x,x,x,x,p,_,_,q,x,x,x,x,x,p,_,_,q,x,x,x,x,x,p,_,d,x,x,x,x,x,x]
    ]

    logo = gui.GraphicCharMatrix(graphic_matrix)
    line = gui.HorizontalLine(graphic.GraphicChar(bg_color, colors.RED, icon.H_LINE), settings.SCREEN_WIDTH + 1)
    title_stack_panel = gui.StackPanelVertical((0, 0), alignment=gui.StackPanelVertical.ALIGN_CENTER)
    title_stack_panel.append(gui.VerticalSpace(int(settings.SCREEN_HEIGHT * 0.2)))
    title_stack_panel.append(line)
    title_stack_panel.append(gui.VerticalSpace(1))
    title_stack_panel.append(logo)
    title_stack_panel.append(gui.VerticalSpace(1))
    title_stack_panel.append(line)
    title_stack_panel.append(gui.VerticalSpace(5))

    bg_rect = gui.FilledRectangle(rectfactory.full_screen_rect(), bg_color)

    ui_state = state.UIState(gui.UIElementList(None))
    hero_name_type_writer = gui.TypeWriter((0, 0), colors.WHITE, colors.GRAY_D, constants.LEFT_SIDE_BAR_WIDTH - 4,
                                           default_text=settings.DEFAULT_PLAYER_NAME)
    main_menu = _main_menu(ui_state, state_stack, lambda: hero_name_type_writer.text, game_state_factory, test_game_state_factory)

    name_heading = gui.TextBox("Name:", (0, 0), colors.CYAN_D, (0, 1))
    menu_stack_panel = gui.StackPanelVertical((0, 0), (0, 0), vertical_space=0,
                                              alignment=gui.StackPanelVertical.ALIGN_CENTER)
    menu_stack_panel.append(name_heading)
    menu_stack_panel.append(hero_name_type_writer)
    menu_stack_panel.append(main_menu)

    dock = gui.UIDock(rectfactory.full_screen_rect())
    dock.bottom = menu_stack_panel

    type_writer_highlight_update = \
        gui.UpdateCallOnlyElement(
            [lambda: type_writer_highlight_update_function(name_heading, hero_name_type_writer,
                                                           main_menu, colors.WHITE,
                                                           colors.GRAY_D, [1, 2])])

    ui_state.ui_element.elements = [bg_rect, title_stack_panel, dock, type_writer_highlight_update]
    return ui_state