Esempio n. 1
0
async def base_menu(message: types.Message):
    """
    Получаем нажатие кнопки из базового меню
    Запускаем соответствующие процесс:
        Атака
        Защита
    """
    logging.info('push basemenu button from: %r', message.from_user.id)
    if message.text == attack_message:
        session_id = DB.new_attack_session(message.from_user.id)

        question_name = 'type_of_attack'
        question = Attack_question.all_questions[question_name]
        text = question.get_text(session_id)
        answers = question.get_options_list()
        keyboard = await make_keyboard(question_name, question.keyboard_type,
                                       session_id, answers)
        await message.answer(text, reply_markup=keyboard)
    elif message.text == defense_message:
        # await message.answer('[раздел в разработке, попробуйте атаку]')
        session_id = DB.new_defense_session(message.from_user.id)

        question_name = 'd_type_of_attack'
        question = Defense_question.all_questions[question_name]
        text = question.get_text(session_id)
        answers = question.get_options_list()
        keyboard = await make_keyboard(question_name, question.keyboard_type,
                                       session_id, answers)
        await message.answer(text, reply_markup=keyboard)

    elif message.text == help_message:
        await send_help(message)
    return
Esempio n. 2
0
async def start(message: types.Message):
    logging.info('start command from: %r', message.from_user.id)

    DB.add_user(message.from_user.id, message.from_user.first_name,
                message.from_user.last_name, message.from_user.username,
                message.from_user.language_code)

    keyboard = await get_basemenu_keyboard()
    text = get_text_from('./questions_text/hello.txt')
    await message.answer(text, reply_markup=keyboard)
Esempio n. 3
0
def skript_for_damage_hit(session_id):
    session = DB.get_defense_session(session_id)
    additional_damage_dict = {
        'Да': 0,
        'Да, на 7-9': 3,
        'Да, на 10-12': 5,
        'Да, на 13-14': 8,
        'Да, на 15 или больше': 10
    }
    additional_damage = additional_damage_dict[session['is_attack_more']]
    damage_hit = session['damage_hit']
    armor = session['armor']
    answer = max(damage_hit - additional_damage - armor, 0) + additional_damage

    DB.save_defense(session_id, 'damage_pierced', answer)
Esempio n. 4
0
async def new_text_message(message: types.Message):
    """
    Принимает текстовые сообщения
    Перенаправляем админу 
    """

    if message.from_user.id in admin_id:
        keyboard = await make_keyboard(question_name='broadcast',
                                       keyboard_type='one',
                                       session_id=0,
                                       answers=['Отправить всем', 'Удалить'])

        global broadcast_text
        broadcast_text = message.text

        await message.answer(message.text, reply_markup=keyboard)

    else:
        for _id in admin_id:
            user_row = DB.get_user(message.from_user.id)
            user_row = [str(x) for x in user_row]
            text = '\n'.join(user_row)
            await bot.send_message(_id, text + '\n' + message.text)
        keyboard = await get_basemenu_keyboard()
        await message.reply(
            'Информация будет передана разработчикам. Спасибо!',
            reply_markup=keyboard)
Esempio n. 5
0
def text_for_attack_failed(session_id):
    session = DB.get_defense_session(session_id)

    type_of_defense = session['type_of_defense']
    if type_of_defense == '+0 Блокирование':
        text = '🛡 Вы отразили атаку.\n\n➡ Орудие, которым персонаж отразил атаку получает 1 урон'
    elif type_of_defense in ['-3 Парирование', '-5 Парирование']:
        text = '🛡 Вы отразили атаку.\n💬 Ваш противник Ошеломлен'
    else:
        text = '🛡 Вы отразили атаку'
    return text
Esempio n. 6
0
async def send_to_everybody(text):
    count = 0
    all_users = DB.get_user()
    keyboard = await get_basemenu_keyboard()
    try:
        for user in all_users:
            user_id = user['id']
            if await send_message(user_id, text, reply_markup=keyboard):
                count += 1
            await asyncio.sleep(
                .05)  # 20 messages per second (Limit: 30 messages per second)
    finally:
        log.info(f"{count} messages successful sent.")

    return count
Esempio n. 7
0
def text_for_armor(session_id):
    session = DB.get_defense_session(session_id)
    place_dict = {
        'Голова': 'голове',
        'Туловище': 'туловище',
        'Рука': 'туловище (рука)',
        'Нога': 'ногах'
    }
    place = session['place']
    place_word = place_dict[place]

    text = f'''
➡ Введите прочность вашей брони на {place_word}
    '''
    return text
Esempio n. 8
0
def text_for_critical_description(session_id):
    session = DB.get_attack_session(session_id)

    is_attack_more_fielde = session['is_attack_more']
    attack_more_defense = is_attack_more_fielde[6:]

    critical_level_dict = {
        'Да, на 7-9': 'Легкий',
        'Да, на 10-12': 'Средний',
        'Да, на 13-14': 'Тяжелый',
        'Да, на 15 или больше': 'Смертельный'
    }
    critical_level = critical_level_dict[is_attack_more_fielde]

    critical_injury_roll = session['critical_injury']

    critical_effect_name = '[тут будет название эффекта]'
    critical_effect = '[тут будет описание эффекта]'
    critical_stabilization = '[тут будет описнаие эффекта после стабилизации]'
    critical_healing = '[тут будет описание эффекта после лечения]'

    text = f'''    
ℹ Атака превышает защиту на: {attack_more_defense}
ℹ Критический уровень: {critical_level}

ℹ Результат броска 2d6: {critical_injury_roll}
ℹ <b>Эффект:</b> {critical_effect_name}
{critical_effect}

ℹ После стабилизации:
{critical_stabilization}

ℹ После лечения: 
{critical_healing}
    
💬 Назовите описание противнику (или перешлите это сообщение)

[раздел в разработке. опиcание критических ранений ищите в книге на стр.158]
    '''
    return text
Esempio n. 9
0
def text_for_damage_hurt(session_id):
    session = DB.get_attack_session(session_id)

    modifier_place_dict = {
        '1 Голова': 3,
        '2-4 Туловище': 1,
        '5 Правая рука': 0.5,
        '6 Левая рука': 0.5,
        '7-8 Правая нога ': 0.5,
        '9-10 Левая нога': 0.5,
        '1 Голова': 3,
        '2-5 Туловище': 1,
        '6-7 Правая конечность': 0.5,
        '8-9 Левая конечность': 0.5,
        '10 Хвост/крыло': 0.5,
        '-6 Голова': 3,
        '-1 Туловище': 1,
        '-3 Рука/Конечность': 0.5,
        '-2 Нога/Крыло/Хвост': 0.5
    }

    resistance_or_dict = {
        'х1/2 Сопротивление': 0.5,
        'х2 Восприимчивость': 2,
        'Нет': 1
    }

    damage = session['damage_hit']

    if session['place_penalty'] == '+0 Случайное место':
        if session['place_humanoid']:
            place_field = session['place_humanoid']
        else:
            place_field = session['place_monster']
    else:
        place_field = session['place_penalty']
    place = ' '.join(place_field.split(' ')[1:])

    modifier_place = modifier_place_dict[place_field]

    resistance_or_field = session['resistance_or']
    modifier_resistance_or = resistance_or_dict[resistance_or_field]
    if resistance_or_field != 'Нет':
        text_modifier_resistance_or = f"{resistance_or_field.split(' ')[1]}: {resistance_or_field.split(' ')[0]}"
    else:
        text_modifier_resistance_or = ''

    result_damage = damage * modifier_place * modifier_resistance_or

    if session['is_attack_more'] == 'Да': finish = '⚔ Вы завершили атаку'
    else: finish = '➡ Нажмите "Далее" чтобы определить критическое ранения'

    text = f'''
ℹ Расчет урона:
Урона преодолело броню: {damage}
Место попадания: {place}
Модификатор места: x{modifier_place}
{text_modifier_resistance_or} 
ℹ <b>Нанесенный урон противнику:</b> {result_damage}

💬 Назовите нанесенный урон противнику

{finish}
    '''
    return text
Esempio n. 10
0
def text_for_damage_more(session_id):
    session = DB.get_attack_session(session_id)

    additional_damage_dict = {
        'Да': 0,
        'Да, на 7-9': 3,
        'Да, на 10-12': 5,
        'Да, на 13-14': 8,
        'Да, на 15 или больше': 10
    }

    if session['type_of_attack'] == 'Магия':
        attack = 'ℹ Вы используете: Магическую атаку'
    else:
        weapon = session['weapon']
        attack = f'ℹ Ваше оружие атаки: {weapon}'

    if session['place_penalty'] == '+0 Случайное место':
        if session['place_humanoid']:
            place_list = session['place_humanoid'].split(' ')[1:]
        else:
            place_list = session['place_monster'].split(' ')[1:]
    else:
        place_list = session['place_penalty'].split(' ')[1:]

    place = ' '.join(place_list)

    weapon_damage = session['weapon_damage']
    result_damage = weapon_damage

    if (session['type_of_attack'] == 'Ближний бой'
            or session['weapon'] == 'Метательное'):
        body_damage = session['body'].split(' ')[0]
        result_damage += int(body_damage)
        plus_body = f'Добавить телосложение: {body_damage}\n'
    else:
        plus_body = ''

    if (session['fast_or_hard'] == '-3 Сильно'):
        result_damage = result_damage * 2
        x_strong_attack = 'Сильная атака: Урон х2 \n'
    else:
        x_strong_attack = ''

    additional_damage = additional_damage_dict[session['is_attack_more']]
    if additional_damage != 0:
        result_damage += additional_damage
        plus_additional_damage = f'Дополнительный урон: {additional_damage}\n'
        comment_additional_damage = '(Доп. урон не блокируется броней)'
        comment_result = f'({result_damage - additional_damage} + {additional_damage}доп.урона)'
    else:
        plus_additional_damage = ''
        comment_additional_damage = ''
        comment_result = ''

    text = f'''
{attack}
ℹ Место попадания: {place}

ℹ Расчет урона:
Выпавший на кубах урон оружия: {weapon_damage}
{plus_body}{x_strong_attack}{plus_additional_damage}    
ℹ <b>Итоговый урон:</b> {result_damage} {comment_result}

💬 Назовите место попадания, урон и тип урона противнику {comment_additional_damage}
➡ <b>Урон преодолел броню?</b>
    '''

    return text
Esempio n. 11
0
def text_for_attack_more(session_id):

    session = DB.get_attack_session(session_id)

    skill_dict = {
        'Меч': 'Владение мечом',
        'Легкий клинок': 'Владение легкими клинками',
        'Древковое оружие': 'Владение древковым оружием',
        'Щит': 'Ближний бой',
        'Рука/Нога': 'Борьба',
        'Метательное': 'Атлетика',
        'Лук': 'Стрельба из лука',
        'Арбалет': 'Стрельба из арбалета',
        'Наносит урон': 'Cотворение заклинаний'
    }

    if session['type_of_attack'] == 'Ближний бой':
        parameter = 'Реакция'
    elif session['type_of_attack'] == 'Магия':
        parameter = 'Воля'
    else:
        parameter = 'Ловкость'

    weapon = session['weapon']
    skill = skill_dict[weapon]

    if session['type_of_attack'] == 'Магия':
        attack = 'ℹ Вы используете: Магическую атаку'
        weapon_accuracy = ''
        modifier = 0
    else:
        attack = f'ℹ Ваше оружие атаки: {weapon}'
        accuracy = session['weapon_accuracy']
        weapon_accuracy = f'{accuracy} Точность оружия\n'
        modifier = int(accuracy)

    list_of_modifiers = []

    if (session['fast_or_hard'] == '-3 Сильно'):
        list_of_modifiers.append('-3 Сильная атака')

    list_of_modifiers.append(session['place_penalty'])

    if session['distance']: list_of_modifiers.append(session['distance'])

    list_of_mod_rows = DB.get_selected_options_from_attack(session_id, 'mod')
    if list_of_mod_rows:
        for row in list_of_mod_rows:
            list_of_modifiers.append(row['value'])

    modifier_names = '\n'.join(list_of_modifiers)

    for item in list_of_modifiers:
        number = item.split(' ')[0]
        modifier += int(number)

    if modifier >= 0: plus = '+'
    else: plus = ''
    text = f'''
{attack}
    
ℹ Все модификаторы:
{weapon_accuracy}{modifier_names}
ℹ Сумма модификаторов: {plus}{modifier}

➡ <b>Рассчитайте атаку по формуле:</b>
Бросок D10 
+ {parameter} 
+ Навык: {skill}
{plus}{modifier}

💬 Назовите значение вашей атаки противнику 
➡ <b>Ваша атака больше защиты противника?</b> Если да, то на сколько?
    '''
    return text
Esempio n. 12
0
def text_for_is_attack_more(session_id):
    session = DB.get_defense_session(session_id)

    skill_dict = {
        'Меч': 'Владение мечом',
        'Легкий клинок': 'Владение легкими клинками',
        'Древковое оружие': 'Владение древковым оружием',
        'Щит': 'Ближний бой',
        'Рука/Нога': 'Борьба'
    }

    type_of_defense = session['type_of_defense'][3:]
    if type_of_defense == 'Уклонение/Изворот':
        parameter = 'Реакция'
        defense_weapon = ''
        skill = 'Уклонение/Изворотливость'
    elif (type_of_defense == 'Изменение позиции'
          or type_of_defense == 'Уклон.[Атлетика]'):
        parameter = 'Ловкость'
        defense_weapon = ''
        skill = 'Атлетика'
    elif type_of_defense == 'Сопротивление магии':
        parameter = 'Воля'
        defense_weapon = ''
        skill = 'Сопротивление магии'
    else:
        parameter = 'Реакция'
        weapon = session['defense_weapon']
        defense_weapon = f'ℹ Ваше орудие защиты: {weapon}'
        skill = skill_dict[weapon]

    opponents = session['opponents']
    modifier = int(opponents.split(' ')[0])

    list_of_modifiers = []

    list_of_modifiers.append(session['type_of_defense'])

    list_of_mod_rows = DB.get_selected_options_from_defense(
        session_id, 'd_mod')
    if list_of_mod_rows:
        for row in list_of_mod_rows:
            list_of_modifiers.append(row['value'])

    modifier_names = '\n'.join(list_of_modifiers)

    for item in list_of_modifiers:
        number = item.split(' ')[0]
        modifier += int(number)

    if modifier >= 0: plus = '+'
    else: plus = ''

    text = f'''
{defense_weapon}
ℹ Способ защиты: {type_of_defense}
    
ℹ Все модификаторы:
{opponents} противников рядом  
{modifier_names}
ℹ Сумма модификаторов: {plus}{modifier}

➡ <b>Рассчитайте защиту по формуле:</b>
Бросок D10 
+ {parameter} 
+ Навык: {skill}
{plus}{modifier}

💬 Назовите значение вашей защиты противнику 
➡ <b>Атака противника больше  вашей защиты?</b> Если да, то на сколько?
    '''
    return text
Esempio n. 13
0
def text_for_damage_hurt(session_id):
    session = DB.get_defense_session(session_id)

    place_dict = {
        'Голова': 'голове',
        'Туловище': 'туловище',
        'Рука': 'туловище',
        'Нога': 'ногах'
    }
    place = session['place']
    place_word = place_dict[place]
    armor = session['armor']

    additional_damage_dict = {
        'Да': 0,
        'Да, на 7-9': 3,
        'Да, на 10-12': 5,
        'Да, на 13-14': 8,
        'Да, на 15 или больше': 10
    }
    additional_damage = additional_damage_dict[session['is_attack_more']]
    damage_hit = session['damage_hit']
    armor = session['armor']
    damage_pierced = session['damage_pierced']

    modifier_place_dict = {
        'Голова': 3,
        'Туловище': 1,
        'Рука': 0.5,
        'Нога': 0.5
    }

    modifier_place = modifier_place_dict[place]

    resistance_or_dict = {
        'х1/2 Сопротивление': 0.5,
        'х2 Восприимчивость': 2,
        'Нет': 1
    }
    resistance_or_field = session['resistance_or']
    modifier_resistance_or = resistance_or_dict[resistance_or_field]
    if resistance_or_field != 'Нет':
        text_modifier_resistance_or = f"{resistance_or_field.split(' ')[1]}: {resistance_or_field.split(' ')[0]}"
    else:
        text_modifier_resistance_or = ''

    result_damage = damage_pierced * modifier_place * modifier_resistance_or

    is_attack_more_fielde = session['is_attack_more']
    if is_attack_more_fielde != 'Да':
        attack_more_defense = is_attack_more_fielde[6:]

        critical_level_dict = {
            'Да, на 7-9': 'Легкий',
            'Да, на 10-12': 'Средний',
            'Да, на 13-14': 'Тяжелый',
            'Да, на 15 или больше': 'Смертельный'
        }
        critical_level = critical_level_dict[is_attack_more_fielde]

        crit = f'''
        
ℹ Атака превышает защиту на: {attack_more_defense}
ℹ Критический уровень: {critical_level}
    
        '''
        hurt = '\n➡ Примените критическое ранение(стр.158)'
    else:
        crit = ''
        hurt = ''

    text = f'''
ℹ Место попадания: {place}

ℹ Расчет урона:
Исходный урон: {damage_hit - additional_damage} + {additional_damage}доп.урона
Прочность брони на {place_word}: {armor}
Урона преодолело броню: {damage_pierced}
Модификатор места: x{modifier_place}
{text_modifier_resistance_or} 
ℹ Получено урона: {result_damage}
{crit}
➡ <b>Учтите полученный урон</b> {hurt} 
➡ Снизьте прочность брони на 1. 
    '''
    return text