示例#1
0
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
示例#2
0
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
示例#3
0
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
示例#4
0
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
示例#5
0
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
示例#6
0
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]