def _calc_own_finish_result(self, union_response, rival_union_res, win, own_soldier_info, enemy_soldier_info, data, skip, heroes, req, timer): union_res = internal_union_pb2.InternalFinishUnionBattleRes() union_res.ParseFromString(union_response) if union_res.status != 0: raise Exception("Query union battle res error") score = 0 if union_res.HasField("individual_battle_score_add"): score = union_res.individual_battle_score_add #结束战斗 if win: if not union_battle_business.win_battle(data, enemy_soldier_info, own_soldier_info, score, timer.now): raise Exception("Win battle failed") else: if not union_battle_business.lose_battle(data, enemy_soldier_info, own_soldier_info, score, timer.now): raise Exception("Lose battle failed") #检查请求 if win: compare.check_user(data, req.monarch, with_level=True) for info in req.battle.attack_heroes: compare.check_hero(data, info.hero, with_level=True) for item_info in req.items: compare.check_item(data, item_info) res = union_battle_pb2.FinishUnionBattleRes() res.status = 0 if union_res.ret != union_pb2.UNION_OK: res.ret = union_res.ret else: res.ret = rival_union_res.ret if skip: pack.pack_monarch_info(data.user.get(True), res.monarch) if win: res.battle_output.result = battle_pb2.BattleOutputInfo.WIN else: res.battle_output.result = battle_pb2.BattleOutputInfo.LOSE for i, hero in enumerate(heroes): attack_hero = res.battle_output.attack_heroes.add() pack.pack_hero_info(hero, attack_hero.hero, timer.now) attack_hero.soldier_survival = own_soldier_info[i][2] if union_res.HasField("battle") and rival_union_res.HasField("battle"): defer = UnionBattlePatcher().patch_by_both_message( res.battle, union_res.battle, rival_union_res.battle, data, timer.now) defer.addCallback(self._calc_finish_post, data, req, res, timer) return defer return self._calc_finish_post(None, data, req, res, timer)
def _pack_query_response(self, users, data, legendcity, unit_res, req, timer): """打包查询响应 """ res = legendcity_pb2.QueryLegendCityRes() res.status = 0 res.ret = unit_res.ret res.city.city_id = legendcity.city_id res.city.slogan = unit_res.slogan res.city.update_slogan_free = unit_res.update_slogan_free res.city.tax = unit_res.tax res.city.update_tax_free = unit_res.update_tax_free res.city.income_by_tax = unit_res.income_by_tax #计算每个官职需要匹配的对手数目 need_rival_count = {} for key in data_loader.LegendCityPositionBasicInfo_dict: info = data_loader.LegendCityPositionBasicInfo_dict[key] if info.cityId == legendcity.city_id: need_rival_count[info.level] = info.displayNum if unit_res.position_level != 0: #玩家自己的官职,可以少匹配一人,因为会显示玩家自己 need_rival_count[unit_res.position_level] -= 1 for (user_id, is_robot, position_level) in legendcity.get_rivals_info(): if need_rival_count[position_level] <= 0: continue need_rival_count[position_level] -= 1 position = res.city.positions.add() position.city_id = legendcity.city_id position.level = position_level pack.pack_monarch_info(users[user_id], position.user) res.city.user.position_level = unit_res.position_level res.city.user.reputation = unit_res.reputation res.city.user.attack_count_left = legendcity.get_attack_count_left() res.city.user.attack_reset_num = legendcity.reset_attack_num for (buff_id, left_time) in legendcity.get_buffs(timer.now): buff = res.city.user.buffs.add() buff.city_buff_id = buff_id buff.left_time = left_time for record in data.legendcity_record_list.get_all(True): if record.city_id == req.city_id: pack.pack_legendcity_record(record, res.city.records.add()) pack.pack_resource_info(data.resource.get(True), res.resource) defer = DataBase().commit(data) defer.addCallback(self._query_succeed, req, res, timer) return defer
def _patch_pay_succeed(self, data, req, timer): """结束购买成功 """ res = pay_pb2.FinishPayRes() res.status = 0 pack.pack_monarch_info(data.user.get(), res.monarchInfo) response = res.SerializeToString() logger.notice("Patch pay succeed[id=%d][req=%s][res=%s][consume=%d]" % (timer.id, req, res, timer.count_ms())) return response
def _pack_finish_appoint_response(self, matcher, data, node_list, items, heroes, mails, req, timer): """构造返回 args: items : list((num, basic_id)元组) heroes: list((basic_id, level, exp, battle_node_basic_id )元组) Returns: res[protobuf]: 向客户端的返回的响应 """ resource = data.resource.get(True) user = data.user.get(True) conscript_list = data.conscript_list.get_all(True) res = appoint_pb2.FinishAppointRes() res.status = 0 res.ret = appoint_pb2.FinishAppointRes.OK pack.pack_resource_info(resource, res.resource) pack.pack_monarch_info(user, res.monarch) for conscript in conscript_list: pack.pack_conscript_info(conscript, res.conscripts.add(), timer.now) for node in node_list: pack.pack_node_info(data, node, res.nodes.add(), timer.now) for item in items: pack.pack_item_info(item, res.items.add()) for hero in heroes: hero_message = res.heros.add() hero_message.basic_id = hero[0] hero_message.level = hero[1] hero_message.exp = hero[2] hero_message.battle_node_id = hero[3] for mail in mails: pack.pack_mail_info(mail, res.mails.add(), timer.now) if 'is_battle_cost_energy' in account_business.get_flags(): energy = data.energy.get() energy.update_current_energy(timer.now) pack.pack_energy_info(energy, res.energy, timer.now) map_business.check_map_data(data) defer = DataBase().commit(data) defer.addCallback(self._finish_appoint_succeed, req, res, timer) return defer
def _pack_try_finish_pay_outside_response(self, data, missions, items): """封装结束购买的响应 """ res = pay_pb2.TryFinishPayOutsideRes() res.status = 0 pack.pack_resource_info(data.resource.get(), res.resource) for mission in missions: pack.pack_mission_info(mission, res.missions.add()) for (item_basic_id, item_num) in items: info = res.items.add() info.basic_id = item_basic_id info.num = item_num pack.pack_monarch_info(data.user.get(), res.monarchInfo) #res.order_number = order_number return res
def _pack_user_info(self, data, basic_data, req, timer, first_init, arena_matcher=None, melee_matcher=None): """打包所有用户数据 Args: data[UserData]: 用户数据 req[protobuf]: 请求 Returns: res[protobuf] """ res = init_pb2.InitRes() res.status = 0 res.first_init = first_init info = res.info user = data.user.get(True) pay = data.pay.get(True) pack.pack_monarch_info(user, info.monarch) union = data.union.get(True) resource = data.resource.get(True) if union.is_belong_to_union(): info.monarch.union_id = union.union_id info.union_battle_stage = UnionBattleStagePatcher().patch( union.union_id) pack.pack_resource_info(data.resource.get(True), info.resource) for item in data.item_list.get_all(True): pack.pack_item_info(item, info.items.add()) for hero in data.hero_list.get_all(True): pack.pack_hero_info(hero, info.heroes.add(), timer.now) for team in data.team_list.get_all(True): pack.pack_team_info(team, info.teams.add()) pack.pack_map_info(data, data.map.get(True), info.map, timer.now) for city in data.city_list.get_all(True): pack.pack_city_info(city, info.cities.add()) for building in data.building_list.get_all(True): pack.pack_building_info(building, info.buildings.add(), timer.now) for technology in data.technology_list.get_all(True): pack.pack_technology_info(technology, info.techs.add(), timer.now) for conscript in data.conscript_list.get_all(True): pack.pack_conscript_info(conscript, info.conscripts.add(), timer.now) assert len(data.defense_list) == 1 pack.pack_money_draw_info(data.draw.get(True), info.money_draw, timer.now) pack.pack_gold_draw_info(data.draw.get(True), info.gold_draw, timer.now) for mission in data.mission_list: pack.pack_mission_info(mission.get(True), info.missions.add()) #邮件看产生时间顺序给出 # data.mail.sort(cmp = None, key=lambda x:x.time, reverse = False) for mail in data.mail_list.get_all(True): pack.pack_mail_info(mail, info.mails.add(), timer.now) pack.pack_sign_info(data.sign.get(True), info.sign_in) #演武场 arena = data.arena.get(True) arena_ranking = 0 if arena_matcher is not None: arena_ranking = arena_matcher.rank pack.pack_arena_info(user, arena, info.arena, timer.now, arena_ranking) #if user.allow_pvp_arena and arena.is_arena_active(timer.now): # #胜场奖励 # if arena.is_able_to_get_win_num_reward(): # pack.pack_arena_reward_info(arena, info.arena.win_num_reward) # #对手信息 # if arena.rivals_user_id != '': # rivals_id = arena.generate_arena_rivals_id() # for rival_id in rivals_id: # rival = data.rival_list.get(rival_id, True) # pack.pack_arena_player(rival, info.arena.rivals.add()) # #系统选定的对战对手 # choose_rival_id = arena.get_choose_rival_id() # choose_rival = data.rival_list.get(choose_rival_id, True) # info.arena.choosed_user_id = choose_rival.rival_id # #对战记录 # record_list = data.arena_record_list.get_all(True) # for record in record_list: # pack.pack_arena_record(record, info.arena.records.add()) flags = account_business.get_flags() if 'is_open_melee' in flags: #乱斗场 melee = data.melee.get(True) melee_ranking = 0 if melee_matcher is not None: melee_ranking = melee_matcher.rank pack.pack_melee_info(user, melee, info.melee_arena, timer.now, melee_ranking) #if melee.is_able_to_unlock(user) and melee.is_arena_active(timer.now): # #胜场奖励 # if melee.is_able_to_get_win_num_reward(): # pack.pack_arena_reward_info(melee, info.melee_arena.win_num_reward) # #对手信息 # if melee.rivals_user_id != '': # rivals_id = melee.generate_arena_rivals_id() # for rival_id in rivals_id: # rival = data.rival_list.get(rival_id, True) # pack.pack_melee_player(rival, info.melee_arena.rivals.add()) # #对战记录 # record_list = data.melee_record_list.get_all(True) # for record in record_list: # pack.pack_arena_record(record, info.melee_arena.records.add()) ##乱斗场阵容 #(heroes_list, positions_list) = melee.get_heroes_position() #if len(heroes_list) > 0: # info.melee_team.index = 0 #for hero_basic_id in heroes_list: # (info.melee_team.heroes.add()).basic_id = hero_basic_id #for position in positions_list: # info.melee_team.hero_positions.append(position) #政令 energy = data.energy.get(True) pack.pack_energy_info(energy, info.energy_info, timer.now) #祈福 pray = data.pray.get(True) pack.pack_pray_info(pray, info.pray, timer.now) #红包 chest = data.chest.get(True) pack.pack_chest_info(chest, info.chest, timer.now) #试炼场 anneal = data.anneal.get(True) pack.pack_anneal_info(data, anneal, info.anneal, timer.now) #打包新手引导进度信息 pack.pack_guide_info(data.user.get(True), info.guide) #将星盘 herostar_list = data.herostar_list.get_all(True) for herostar in herostar_list: info.hero_star.append(herostar.star_id) #世界boss #pack.pack_worldboss_info(data.worldboss.get(True), user, info.world_boss, timer.now) #功能开关 #flags = account_business.get_flags() pack.pack_flag_info(flags, info.flags) #扩展副本 dungeons = data.expand_dungeon_list.get_all() for dungeon in dungeons: dungeon.daily_update(timer.now) pack.pack_expand_dungeon_info(dungeon, user, info.expand_dungeons.add(), 0, timer.now, brief=True) #主界面的按钮提示 pack.pack_button_tips(basic_data, data, info, timer.now) #lua #pack.pack_luas(info.luas) logger.notice( "Submit Role[user_id=%d][level=%d][name=%s][vip=%d][status=LOGIN][create_time=%d][last_login_time=%d][money=%d][food=%d][gold=%d][pay_count=%d][pay_amount=%.2f]" % (user.id, user.level, user.name, user.vip_level, user.create_time, user.last_login_time, resource.money, resource.food, resource.gold, pay.pay_count, pay.pay_amount)) #log = log_formater.output_gold(data, 0, log_formater.INIT_RESOURCE_GOLD, # "Gain gold from init resource", before_gold = data.resource.get(True).gold) #logger.notice(log) return self._init_succeed(data, req, res, timer)