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
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
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
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
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)
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
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)
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)
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)
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)
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))
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