def _split_group(character_groups: CharacterGroups, idx_group: int) -> CharacterGroups: idx_group = prompt_choices(character_groups, lambda i, characters: ' {} - {}'.format( i, ', '.join(c.name for c in characters)), default=idx_group) characters = character_groups[idx_group][:] new_groups = [] i = 1 while characters: print('Group {}'.format(i)) idxs = prompt_choices(characters, lambda i, char: ' {} - {} ({})'.format( i, char.name, char.player_name), multiple=True) if not idxs: continue new_groups.append([characters[i] for i in idxs]) for idx_pop in idxs: characters.pop(idx_pop) i += 1 character_groups += new_groups character_groups.pop(idx_group) return character_groups
def init_characters(session: sqlalchemy.orm.Session) -> CharacterGroups: """ Initialize the party's characters. Returns: Character groups. """ characters = [] while 1: name = input('Character name: ') if not name: break chars = session.query( models.Character).filter(models.Character.name == name).all() if not chars: try: new_char = prompt_bool('New character?', False) except MalformedBoolException: continue if not new_char: continue player_name = input('Player name: ') char = models.Character(name=name, player_name=player_name) else: try: idx = prompt_choices( chars, lambda i, char: ' {} - {} ({})'.format( i, char.name, char.player_name)) except MalformedInputException: continue char = chars[idx] default_lvl = char.level or 1 try: char.level = int( input('Level: [{}] '.format(default_lvl)) or default_lvl) except ValueError: print('Supply integer level.') continue characters.append(char) character_groups = init_locations(session, characters) session.add_all(x for sl in character_groups for x in sl) session.commit() return character_groups
def _remove_group(character_groups: CharacterGroups, idx_group: int) -> CharacterGroups: idx = prompt_choices(character_groups, lambda i, characters: ' {} - {}'.format( i, ', '.join(c.name for c in characters)), default=idx_group) character_groups.pop(idx) return character_groups
def _select_new_area(session: sqlalchemy.orm.Session) -> models.Area: """ Choose an area from user input. """ name = input('What is the name of the area? ') areas = session.query(models.Area).filter(models.Area.name == name) if not areas: print('No areas found by that name. Please try again.') return _select_new_area(session) idx = prompt_choices( areas, lambda i, area: ' {} - {} ({})'.format(i, area.name, area.full_name())) area = areas[idx] return area
def _select_area(session: sqlalchemy.orm.Session, areas_chosen: List[models.Area]) -> models.Area: """ Choose an area (new or from existing). """ if not areas_chosen: return _select_new_area(session) idx = prompt_choices(areas_chosen, lambda i, char: ' {} - {} ({})'.format( i, area.name, area.full_name()), suffix_choices='\n {} - {}\n'.format( 'New area', len(areas_chosen))) if idx == len(areas_chosen): area = _select_new_area(session) else: area = areas_chosen[idx] return area
def _merge_groups(character_groups: CharacterGroups, idx_group: int) -> Tuple[CharacterGroups, int]: idxs = prompt_choices(character_groups, lambda i, characters: ' {} - {}'.format( i, ', '.join(c.name for c in characters)), default=idx_group, multiple=True) area = character_groups[idxs[0]].area new_char_group = character_groups[idxs[0]] for i in idxs[1:]: for c in character_groups[i]: c.area = area new_char_group.append(c) for i in idxs[1:]: character_groups.pop(i) return character_groups, idxs[0]