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