def handle_keys(): global playerx, playery, fov_recompute #console controls key = libtcod.console_wait_for_keypress( True) # THIS LINE IS SPECIFIC FOR TURN BASED if key.vk == libtcod.KEY_ENTER and key.lalt: #ALT+ENTER toggle fullscreen libtcod.console_set_fullscreen(not libtcod.console_is_fullscreen()) elif key.vk == libtcod.KEY_ESCAPE: return 'exit' # exit game #movement keys #is_key_pressed is supposed to be for real-time and check_for_keypress is for TURN BASED #but it behaved strangely if i did not use is_key_pressed if game_state == 'playing': if libtcod.console_is_key_pressed(libtcod.KEY_UP): player_move_or_attack(0, -1) elif libtcod.console_is_key_pressed(libtcod.KEY_DOWN): player_move_or_attack(0, 1) elif libtcod.console_is_key_pressed(libtcod.KEY_LEFT): player_move_or_attack(-1, 0) elif libtcod.console_is_key_pressed(libtcod.KEY_RIGHT): player_move_or_attack(1, 0) else: #all other keys key_char = chr(key.c) if key_char == 'g': #pick up item for stuff in objects: if stuff.x == player.x and stuff.y == player.y and stuff.item: stuff.item.pick_up() break if key_char == 'i': #show inventory chosen_item = inventory_menu( 'Press the key next to an item to use it, or any other to cancel. \n' ) if chosen_item is not None: chosen_item.use() if key_char == 'd': chosen_item = inventory_menu( 'Press they key next to an item to drop it, or any other to cancel. \n' ) if chosen_item is not None: chosen_item.drop() return 'didnt-take-turn'
def handle_keys(): global playerx, playery, fov_recompute #console controls key = libtcod.console_wait_for_keypress(True) # THIS LINE IS SPECIFIC FOR TURN BASED if key.vk == libtcod.KEY_ENTER and key.lalt: #ALT+ENTER toggle fullscreen libtcod.console_set_fullscreen(not libtcod.console_is_fullscreen()) elif key.vk == libtcod.KEY_ESCAPE: return 'exit' # exit game #movement keys #is_key_pressed is supposed to be for real-time and check_for_keypress is for TURN BASED #but it behaved strangely if i did not use is_key_pressed if game_state == 'playing': if libtcod.console_is_key_pressed(libtcod.KEY_UP): player_move_or_attack(0,-1) elif libtcod.console_is_key_pressed(libtcod.KEY_DOWN): player_move_or_attack(0,1) elif libtcod.console_is_key_pressed(libtcod.KEY_LEFT): player_move_or_attack(-1,0) elif libtcod.console_is_key_pressed(libtcod.KEY_RIGHT): player_move_or_attack(1,0) else: #all other keys key_char = chr(key.c) if key_char == 'g': #pick up item for stuff in objects: if stuff.x == player.x and stuff.y == player.y and stuff.item: stuff.item.pick_up() break if key_char == 'i': #show inventory chosen_item = inventory_menu('Press the key next to an item to use it, or any other to cancel. \n') if chosen_item is not None: chosen_item.use() if key_char == 'd': chosen_item = inventory_menu('Press they key next to an item to drop it, or any other to cancel. \n') if chosen_item is not None: chosen_item.drop() return 'didnt-take-turn'
def handle_keys(): # key = libtcod.console_check_for_keypress() #real-time key = libtcod.console_wait_for_keypress(True) # turn-based if key.vk == libtcod.KEY_ENTER and key.lalt: # Alt+Enter: toggle fullscreen libtcod.console_set_fullscreen(not libtcod.console_is_fullscreen()) elif key.vk == libtcod.KEY_ESCAPE: return True # exit game # elif key.c == ord('y') or key.c == ord('Y'): # # Show/hide amulet # amulet.toggle() elif amulet.visible and amulet.is_blocking(): if key.vk < libtcod.KEY_0 or key.vk > libtcod.KEY_KP9: # This is for the ReviewExperienceMenu only Messenger().message('You need to enter a score before continuing!') return else: success = amulet.keyboard_input(key.vk) if not success: return else: # movement keys if libtcod.console_is_key_pressed( libtcod.KEY_UP) and player.char != 'X': player.move(dungeon_map, 0, -1) elif libtcod.console_is_key_pressed( libtcod.KEY_DOWN) and player.char != 'X': player.move(dungeon_map, 0, 1) elif libtcod.console_is_key_pressed( libtcod.KEY_LEFT) and player.char != 'X': player.move(dungeon_map, -1, 0) elif libtcod.console_is_key_pressed( libtcod.KEY_RIGHT) and player.char != 'X': player.move(dungeon_map, 1, 0) # TEMPORARY: press r to review a business elif key.c == ord('r'): biz = random.choice(district.businesses) biz.visit(player) elif key.vk >= libtcod.KEY_0 and key.vk <= libtcod.KEY_KP9: # If amulet is displayed, redirect numeric input to amulet amulet.keyboard_input(key.vk)
def menu(header, options, width): if len(options) > 26: raise ValueError( 'Cannot have a menu with more than 26 options.') # calculate total height for the header (after auto-wrap) and one # line per option header_height = libtcod.console_get_height_rect(con, 0, 0, width, SCREEN_HEIGHT, header) if header == '': header_height = 0 height = len(options) + header_height # create an off-screen console that represents the menu's window window = libtcod.console_new(width, height) # print the header, with auto-wrap libtcod.console_set_default_foreground(window, libtcod.white) libtcod.console_print_rect_ex(window, 0, 0, width, height, libtcod.BKGND_NONE, libtcod.LEFT, header) # print all the options y = header_height letter_index = ord('a') for option_text in options: text = '(' + chr(letter_index) + ') ' + option_text libtcod.console_print_ex(window, 0, y, libtcod.BKGND_NONE, libtcod.LEFT, text) y += 1 letter_index += 1 # blit the contents of "window" to the root console x = SCREEN_WIDTH / 2 - width / 2 y = SCREEN_HEIGHT / 2 - height / 2 libtcod.console_blit(window, 0, 0, width, height, 0, x, y, 1.0, 0.7) # present the root console to the player and wait for a key-press libtcod.console_flush() key = libtcod.console_wait_for_keypress(True) # (special case) Alt+Enter: toggle fullscreen if key.vk == libtcod.KEY_ENTER and key.lalt: libtcod.console_set_fullscreen(not libtcod.console_is_fullscreen) # convert the ASCII code to an index; if it corresponds to an # option, return it index = key.c - ord('a') if index >= 0 and index < len(options): return index return None
def handle_input(): key = libtcod.console_check_for_keypress(libtcod.KEY_PRESSED) mouse = libtcod.mouse_get_status() (x, y) = (mouse.cx, mouse.cy) if key.vk == libtcod.KEY_ENTER and key.lalt: #Alt+Enter: toggle fullscreen libtcod.console_set_fullscreen(not libtcod.console_is_fullscreen()) elif key.vk == libtcod.KEY_ESCAPE: return 'exit' #exit game elif chr(key.c) == 'r': reset() if game_state == 'playing': #movement keys if key.vk == libtcod.KEY_KP8 or key.vk == libtcod.KEY_UP: player_move_or_attack(0, -1) elif key.vk == libtcod.KEY_KP2 or key.vk == libtcod.KEY_DOWN: player_move_or_attack(0, 1) elif key.vk == libtcod.KEY_KP4 or key.vk == libtcod.KEY_LEFT: player_move_or_attack(-1, 0) elif key.vk == libtcod.KEY_KP6 or key.vk == libtcod.KEY_RIGHT: player_move_or_attack(1, 0) elif key.vk == libtcod.KEY_KP7: player_move_or_attack(-1, -1) elif key.vk == libtcod.KEY_KP9: player_move_or_attack(1, -1) elif key.vk == libtcod.KEY_KP1: player_move_or_attack(-1, 1) elif key.vk == libtcod.KEY_KP3: player_move_or_attack(1, 1) #if nearest player neighbor is clicked elif mouse.lbutton: angle = math.atan2(player.y-y, player.x-x)/math.pi*180 if angle > 157.5: player_move_or_attack(1, 0) elif 157.5 > angle > 112.5: player_move_or_attack(1, -1) elif 112.5 > angle > 67.5: player_move_or_attack(0, -1) elif 67.5 > angle > 22.5: player_move_or_attack(-1, -1) elif 22.5 > angle > -22.5: player_move_or_attack(-1, 0) elif -22.5 > angle > -67.5: player_move_or_attack(-1, 1) elif -67.5 > angle > -112.5: player_move_or_attack(0, 1) elif -112.5 > angle > -157.5: player_move_or_attack(1, 1) elif -157.5 > angle: player_move_or_attack(1, 0) else: #test for other keys key_char = chr(key.c) if key_char == 'n': for object in objects: #look for an item in the player's tile if object.x == player.x and object.y == player.y and isinstance(object, Object): if object.name == 'hole': next_level() break else: no_hole = True if no_hole == True: message('There is no hole down there.') if key_char == 'g': #pick up an item for object in objects: #look for an item in the player's tile if object.x == player.x and object.y == player.y and isinstance(object, Item): object.pick_up() break if key_char == 'i': #show the inventory; if an item is selected, use it chosen_item = inventory_menu('Press the key next to an item to use it, or any other to cancel.\n') if chosen_item is not None: chosen_item.use() if key_char == 'd': #show the inventory; if an item is selected, drop it chosen_item = inventory_menu('Press the key next to an item to drop it, or any other to cancel.\n') if chosen_item is not None: chosen_item.drop() return 'didnt-take-turn'
def handle_keys(): global key if key.vk == libtcod.KEY_ENTER and key.lalt: # Alt+Enter: toggle fullscreen libtcod.console_set_fullscreen(not libtcod.console_is_fullscreen()) elif key.vk == libtcod.KEY_ESCAPE: # exit game return 'exit' if game_state == 'playing': # movement keys if key.vk == libtcod.KEY_UP or key.vk == libtcod.KEY_KP8: player_move_or_attack(0, -1) elif key.vk == libtcod.KEY_DOWN or key.vk == libtcod.KEY_KP2: player_move_or_attack(0, 1) elif key.vk == libtcod.KEY_LEFT or key.vk == libtcod.KEY_KP4: player_move_or_attack(-1, 0) elif key.vk == libtcod.KEY_RIGHT or key.vk == libtcod.KEY_KP6: player_move_or_attack(1, 0) elif key.vk == libtcod.KEY_HOME or key.vk == libtcod.KEY_KP7: player_move_or_attack(-1, -1) elif key.vk == libtcod.KEY_PAGEUP or key.vk == libtcod.KEY_KP9: player_move_or_attack(1, -1) elif key.vk == libtcod.KEY_END or key.vk == libtcod.KEY_KP1: player_move_or_attack(-1, 1) elif key.vk == libtcod.KEY_PAGEDOWN or key.vk == libtcod.KEY_KP3: player_move_or_attack(1, 1) elif key.vk == libtcod.KEY_KP5: # do nothing ie wait for the monster to come to you pass else: # test for other keys key_char = chr(key.c) if key_char == 'g': # pick up an item, after looking for an item in the # player's tile for object in objects: if object.x == player.x and object.y == player.y and \ object.item: object.item.pick_up() break if key_char == 'i': # show the inventory; if an item is selected, use it chosen_item = inventory_menu( 'Press the key next to an item to use it, or any other to' ' cancel.\n') if chosen_item is not None: chosen_item.use() if key_char == 'd': # show the inventory; if an item is selected, drop it chosen_item = inventory_menu( 'Press the key next to an item to drop it, or any other' ' to cancel.\n') if chosen_item is not None: chosen_item.drop() if key_char == 'c': # show character information level_up_xp = LEVEL_UP_BASE + player.level * LEVEL_UP_FACTOR msgbox('Character Information\n\nLevel: ' + str(player.level) + '\nExperience: ' + str(player.fighter.xp) + '\nExperience to level up: ' + str(level_up_xp) + '\n\nMaximum HP: ' + str(player.fighter.max_hp) + '\nAttack: ' + str(player.fighter.power) + '\nDefense: ' + str(player.fighter.defense), CHARACTER_SCREEN_WIDTH) if key_char == '<': # go down stairs, if the player is on them if stairs.x == player.x and stairs.y == player.y: next_level() return 'didnt-take-turn'
def handle_input(): key = libtcod.console_check_for_keypress(libtcod.KEY_PRESSED) mouse = libtcod.mouse_get_status() (x, y) = (mouse.cx, mouse.cy) if key.vk == libtcod.KEY_ENTER and key.lalt: #Alt+Enter: toggle fullscreen libtcod.console_set_fullscreen(not libtcod.console_is_fullscreen()) elif key.vk == libtcod.KEY_ESCAPE: return 'exit' #exit game elif chr(key.c) == 'r': reset() if game_state == 'playing': #movement keys if key.vk == libtcod.KEY_KP8 or key.vk == libtcod.KEY_UP: player_move_or_attack(0, -1) elif key.vk == libtcod.KEY_KP2 or key.vk == libtcod.KEY_DOWN: player_move_or_attack(0, 1) elif key.vk == libtcod.KEY_KP4 or key.vk == libtcod.KEY_LEFT: player_move_or_attack(-1, 0) elif key.vk == libtcod.KEY_KP6 or key.vk == libtcod.KEY_RIGHT: player_move_or_attack(1, 0) elif key.vk == libtcod.KEY_KP7: player_move_or_attack(-1, -1) elif key.vk == libtcod.KEY_KP9: player_move_or_attack(1, -1) elif key.vk == libtcod.KEY_KP1: player_move_or_attack(-1, 1) elif key.vk == libtcod.KEY_KP3: player_move_or_attack(1, 1) #if nearest player neighbor is clicked elif mouse.lbutton: angle = math.atan2(player.y - y, player.x - x) / math.pi * 180 if angle > 157.5: player_move_or_attack(1, 0) elif 157.5 > angle > 112.5: player_move_or_attack(1, -1) elif 112.5 > angle > 67.5: player_move_or_attack(0, -1) elif 67.5 > angle > 22.5: player_move_or_attack(-1, -1) elif 22.5 > angle > -22.5: player_move_or_attack(-1, 0) elif -22.5 > angle > -67.5: player_move_or_attack(-1, 1) elif -67.5 > angle > -112.5: player_move_or_attack(0, 1) elif -112.5 > angle > -157.5: player_move_or_attack(1, 1) elif -157.5 > angle: player_move_or_attack(1, 0) else: #test for other keys key_char = chr(key.c) if key_char == 'n': for object in objects: #look for an item in the player's tile if object.x == player.x and object.y == player.y and isinstance( object, Object): if object.name == 'hole': next_level() break else: no_hole = True if no_hole == True: message('There is no hole down there.') if key_char == 'g': #pick up an item for object in objects: #look for an item in the player's tile if object.x == player.x and object.y == player.y and isinstance( object, Item): object.pick_up() break if key_char == 'i': #show the inventory; if an item is selected, use it chosen_item = inventory_menu( 'Press the key next to an item to use it, or any other to cancel.\n' ) if chosen_item is not None: chosen_item.use() if key_char == 'd': #show the inventory; if an item is selected, drop it chosen_item = inventory_menu( 'Press the key next to an item to drop it, or any other to cancel.\n' ) if chosen_item is not None: chosen_item.drop() return 'didnt-take-turn'
def toggleFullScreen(self): libtcod.console_set_fullscreen(not libtcod.console_is_fullscreen())