def handle(self, call): call_data = call.data.split('_') try: fight = dynamic_dicts.fight_dict[call_data[2]] unit = fight.units_dict[int(call_data[1])] except KeyError: return self.handler.game_error(call) if unit.controller.message_id == call.message.message_id and unit.active: action = action_dict[call_data[3]](unit, fight, info=call_data, call=call) availability = action.available() if not availability: error_text = action.error_text() self.handler.error(error_text, call) return False unit.active = False action.act() else: bot_methods.err( 'Ошибка обработки запроса к ActionHandler. Controller_id={}, message_id={}, unit_active={}' .format(unit.controller.chat_id, call.message.message_id, unit.active)) return self.handler.actor_error(call)
def process_fight_results(self, results): bot_methods.err('Processing fight results...') if not any(unit_dict['name'] == self.dungeon.party.leader.unit_dict['name'] for unit_dict in results['winners']): def get_exit_keyboard(mmbr): keyboard = form_keyboard( DungeonButton('Покинуть карту', mmbr, 'menu', 'defeat', named=True)) return keyboard self.dungeon.party.send_message( 'Вы проиграли!', reply_markup_func=get_exit_keyboard) else: for member in self.dungeon.party.members: member.occupied = False member.unit_dict = [ unit_dict for unit_dict in results['winners'] if unit_dict['name'] == member.unit_dict['name'] ][0] member.inventory.update() loot = results['loot'] + self.loot experience = sum([ units.units_dict[mob].experience for mob in self.mobs.mob_units if self.mobs is not None ]) self.dungeon.party.experience += experience self.dungeon.party.distribute_loot(loot) self.victory()
def visualize(self): map_string = '' for x in range(0, self.width): for y in range(0, self.height): map_string += self.location_matrix[(x, y)].emote + ' ' map_string += '\n' bot_methods.err(map_string)
def occupied(self): if any([member.occupied for member in self.members]): for member in self.members: bot_methods.err('Занятость {}: {}'.format( member.name, member.occupied)) return True return False
def action(call): if call.data == 'test': bot_methods.answer_callback_query(call, '89296052405', alert=True) try: call_handler.handle(call) except Exception as e: import traceback bot_methods.err(traceback.format_exc())
def str(self, lang): string_data = get_string(self, lang) try: tuple_string = text_generation.generate_unique_text( string_data[self.string]) return self.format(tuple_string, lang) except TypeError: bot_methods.err(str((self.string, self.table, self.row)))
def add_user(self, user_id): session.add(self.pyosession.user_class(user_id, self.chat_id)) try: session.commit() except Exception as e: import traceback bot_methods.err(traceback.format_exc()) session.rollback() pass
def handler(self, call): bot_methods.err(call.data) data = call.data.split('_') action = data[3] if action == 'attack': self.state = 'attacked' self.reset_message('text_2', image=self.mob_image, keyboard_func=False) self.fight()
def handler(self, call): bot_methods.err(call.data) data = call.data.split('_') action = data[3] if action == 'map': bot_methods.bot.edit_message_reply_markup( chat_id=call.from_user.id, message_id=call.message.message_id) for member in self.dungeon.party.members: member.occupied = False self.dungeon.update_map(new=True)
def send_string(self): self.string_tuple.construct() if self.string_tuple.active: for listener in self.listeners: bot_methods.err(listener.unit.name) listener.send_message(self.string_tuple[listener.lang]) time.sleep(0.5) if self.public and self.chat_id not in self.listeners: self.send_message(self.string_tuple[self.lang]) self.string_tuple.clear()
def run_fight(self, *args, first_turn=None): # В качестве аргумента должны быть переданы словари команд в виде # [team={chat_id: unit_dict} or team={(ai_class, n):unit_dict}]. try: fight = fight_main.Fight(chat_id=self.chat_id) fight.form_teams(args) results = fight.run(first_turn=first_turn) return results except Exception as e: import traceback bot_methods.err(traceback.format_exc())
def event_fight(self, first_turn=None): try: for member in self.dungeon.party.members: member.occupied = True results = self.dungeon.run_fight(self.dungeon.party.join_fight(), self.mob_team, first_turn=first_turn) self.process_fight_results(results) except Exception: import traceback bot_methods.err(traceback.format_exc())
def run_fight(*args, chat_id=None): # В качестве аргумента должны быть переданы словари команд в виде # [team={chat_id:(name, unit_dict)} or team={ai_class:(ai_class.name, unit_dict)}]. try: fight = Fight(chat_id=chat_id) fight.form_teams(*args) results = fight.run() return results except Exception as e: import traceback bot_methods.err(traceback.format_exc())
def handler(self, call): bot_methods.err(call.data) data = call.data.split('_') action = data[3] if action == 'map': bot_methods.bot.edit_message_reply_markup( chat_id=call.from_user.id, message_id=call.message.message_id) for member in self.dungeon.party.members: member.occupied = False self.dungeon.update_map(new=True) elif action == 'sneak': if engine.roll_chance(50): self.state = 'sneaked' for member in self.dungeon.party.members: member.delete_message() self.dungeon.party.send_message( self.get_lang_tuple('text_1'), image=self.image, reply_markup=self.get_action_keyboard()) else: self.state = 'attacked' for member in self.dungeon.party.members: member.delete_message() image = create_dungeon_image( './files/images/backgrounds/dark_forest.jpg', self.mobs.get_image_tuples()) self.fight(first_turn='mobs') elif action == 'leave': for member in self.dungeon.party.members: member.delete_message() member.occupied = False self.dungeon.party.send_message(self.get_lang_tuple('text_3'), image=self.image) self.dungeon.update_map(new=True) elif action == 'attack': self.state = 'attacked' for member in self.dungeon.party.members: member.delete_message() image = create_dungeon_image( 'D:\YandexDisk\Veganwars\Veganwars\\files\images\\backgrounds\dark_forest.jpg', self.mobs.get_image_tuples()) self.dungeon.party.send_message(self.get_lang_tuple('text_2'), image=image) self.fight() elif action == 'sneak_attack': self.state = 'attacked' for member in self.dungeon.party.members: member.delete_message() image = create_dungeon_image( 'D:\YandexDisk\Veganwars\Veganwars\\files\images\\backgrounds\dark_forest.jpg', self.mobs.get_image_tuples()) self.dungeon.party.send_message(self.get_lang_tuple('text_2'), image=image) self.fight(first_turn='party')
def handle(self, call): call_split = call.data.split('_') bot_methods.err(call_split) call_type = call_split[0] if call_type == 'switch': try: dynamic_dicts.lobby_list[call.message.chat.id].change_team( call.from_user.id) except KeyError: pass else: type_handler = self.type_dicts[call_type] type_handler.handle(call)
def handler(self, call): bot_methods.err(call.data) data = call.data.split('_') action = data[3] if action == 'attack': self.state = 'attacked' self.reset_message('text_2', image=self.image_file, keyboard_func=False) self.fight() elif action == 'map': self.reset_message('text_3', image=self.image_file, keyboard_func=False) for member in self.dungeon.party.members: member.occupied = False self.dungeon.update_map(new=True)
def handle(self, call): bot_methods.err(call.data) call_data = call.data.split('_') action = call_data[2] try: party = dynamic_dicts.dungeons[call.message.chat.id].party member = party.member_dict[call.from_user.id] except KeyError: return False # Перемещение группы if action == 'move': party.move_handler(call) # Действия с инвентарем elif action == 'item': member.inventory.handler(call) elif action == 'menu': member.menu_handler(call) elif action == 'location': party.current_location.handler(call)
def handler(self, call): bot_methods.err(call.data) data = call.data.split('_') action = data[3] if action == 'map': bot_methods.bot.edit_message_reply_markup( chat_id=call.from_user.id, message_id=call.message.message_id) for member in self.dungeon.party.members: member.occupied = False self.dungeon.update_map(new=True) elif action == 'scout': self.state = 'scouted' self.dungeon.party.exhaust() self.reset_message('text_1', image=self.mob_image, short_member_ui=True) elif action == 'rush': self.state = 'rushed' self.reset_message('text_2', image=self.mob_image, keyboard_func=False) self.fight(first_turn='mobs') elif action == 'attack': self.state = 'attacked' self.reset_message('text_5', image=self.mob_image, keyboard_func=False) self.fight() elif action == 'back': self.reset_message('text_6', image=self.mob_image, keyboard_func=False) for member in self.dungeon.party.members: member.occupied = False self.dungeon.party.move(self.entrance_location, new_map=True, exhaust=False, events=False)
def handler(self, call): bot_methods.err(call.data) data = call.data.split('_') action = data[3] if action == 'map': bot_methods.bot.edit_message_reply_markup( chat_id=call.from_user.id, message_id=call.message.message_id) for member in self.dungeon.party.members: member.occupied = False self.dungeon.update_map(new=True) elif action == 'scout': self.state = 'scouted' self.reset_message(self.image, 'text_1') elif action == 'rush': self.state = 'rushed' image = create_dungeon_image( 'D:\YandexDisk\Veganwars\Veganwars\\files\images\\backgrounds\dark_forest.jpg', self.mobs.get_image_tuples()) self.reset_message(image, 'text_2', keyboard_func=None) self.fight() elif action == 'victory': self.state = 'scouted' self.reset_message(self.image, 'text_1')
def action(call): try: call_handler.handle(call) except Exception as e: import traceback bot_methods.err(traceback.format_exc())
def victory(self): bot_methods.err(str(self.continue_func)) self.continue_func(**self.kwargs)
def start_fight(self): try: self.lobby.run() except Exception: import traceback bot_methods.err(traceback.format_exc())
def handler(self, call): bot_methods.err(call.data) data = call.data.split('_') action = data[3] self.get_action_dict()[action](call)
def start(message): bot_methods.err(message) if message.chat.id < 0: chat = chat_main.pyossession.get_chat(message.chat.id) chat.ask_attack(message.from_user.id)
def start(message): bot_methods.err(message.photo[0].file_id)
def start(message): if message.from_user.id == config.admin_id: bot_methods.err(message.for_error)
def start(message): if message.from_user.id == config.admin_id: bot_methods.err(message.chat.id) bot.send_message(config.admin_id, message.text)