def _try_forward_season_for_user_not_belong_to_union(self): """让不属于任何联盟的玩家,且参加过上个赛季联盟战争的玩家,进入下一个赛季 """ users = [] flag = True begin = 0 gap = 50 while flag: proxy = DataProxy() proxy.search_by_rank("union", "season_score", begin, begin + gap) defer = proxy.execute() for i, indiv_info in enumerate( proxy.get_rank_result("union", "season_score", begin, begin + gap)): if indiv_info.season_score > 0: if indiv_info.user_id not in users: users.append(indiv_info.user_id) else: flag = False break begin += gap for user_id in users: req = internal_pb2.UnionBattleForwardReq() defer = GlobalObject().root.callChild( "portal", "forward_union_battle_season_forward", user_id, req.SerializeToString()) defer.addCallback( self._check_forward_season_for_user_not_belong_to_union)
def match(self, now): proxy = DataProxy() proxy.search_by_rank("unionunion", "recent_prosperity", self.RANK_START, self.RANK_STOP) defer = proxy.execute() defer.addCallback(self._calc_result) return defer
def update_last_user_level(): """更新第50名用户的等级""" proxy = DataProxy() proxy.search_by_rank("battle_score", "score", 0, 49) defer = proxy.execute() defer.addCallback(_update_last_user_level_rank) return defer
def _calc_union_season_battle_individual(self, data, req, timer): if req.start_index < 1 or req.start_index > req.end_index: raise Exception("Ranking req error") req.end_index = 50 #TODO 客户端赋值错误,临时方案,待客户端修复 proxy = DataProxy() proxy.search_ranking("union", "season_score", data.id) proxy.search_by_rank("union", "season_score", req.start_index - 1, min(20, req.end_index - 1)) defer = proxy.execute() defer.addCallback(self._calc_union_season_battle_individual_post, data, req, timer) defer.addCallback(self._query_succeed, req, timer) return defer
def _query_worldboss_ranking(self, user_id, req, timer): if req.start_index < 1 or req.start_index > req.end_index: raise Exception("Ranking req error") proxy = DataProxy() proxy.search("worldboss", user_id) #先查玩家自己的worldboss proxy.search_ranking("worldboss", "merit", user_id) #先查玩家自己的排名 proxy.search_by_rank("worldboss", "merit", req.start_index - 1, req.end_index - 1) defer = proxy.execute() defer.addCallback(self._calc_query_worldboss_ranking, user_id, req, timer) defer.addErrback(self._query_worldboss_ranking_failed, req, timer) return defer
def _query_activity_hero_ranking(self, user_id, req, timer): if req.start_index < 1 or req.start_index > req.end_index: raise Exception("Ranking req error") proxy = DataProxy() proxy.search("draw", user_id) #先查玩家自己的draw proxy.search_ranking("draw", "activity_scores", user_id) #先查玩家自己的排名 proxy.search_by_rank("draw", "activity_scores", req.start_index - 1, req.end_index - 1) defer = proxy.execute() defer.addCallback(self._calc_query_activity_hero_ranking, user_id, req, timer) defer.addErrback(self._query_activity_hero_ranking_failed, req, timer) return defer
def _match_melee(self, status, data, melee): """匹配副本对手 """ assert status is True x = self.rank players_rank = [] #根据规则,挑选出要选作对手的玩家排名 if x <= 10: if x == 1: players_rank += random.sample(range(2, x + 50), 3) elif x == 2: players_rank.append(1) players_rank += random.sample(range(3, x + 50), 2) else: players_rank += random.sample(range(1, x), 1) players_rank += random.sample(range(x, x + 50), 2) elif x > 10 and x <= 100: players_rank += random.sample( range(int(math.ceil(0.5 * x - 5)), x), 1) players_rank += random.sample(range(x, x + 100), 2) elif x > 100 and x <= 1000: #players_rank += random.sample(range(int(math.ceil(0.5 * x - 10)), int(math.ceil(0.5 * x + 10))), 1) players_rank += random.sample( range(int(math.ceil(0.5 * x - 10)), x), 1) #players_rank += random.sample(range(x-30, x), 1) players_rank += random.sample(range(x, x + 100), 2) elif x > 1000: #players_rank += random.sample(range(int(math.ceil(0.5 * x - 50)), int(math.ceil(0.5 * x + 50))), 1) players_rank += random.sample( range(int(math.ceil(0.5 * x - 50)), x), 1) #players_rank += random.sample(range(int(math.ceil(0.9 * x - 100)), x), 1) players_rank += random.sample(range(x, x + 100), 2) assert len(players_rank) == 3 logger.debug("match players by rank[self_rank=%d][match rank=[%d, %d, %d]" %\ (x, players_rank[0], players_rank[1], players_rank[2])) cache_proxy = DataProxy() for rank in players_rank: if rank > self.users_count: #超过本房间人数则跳过 continue cache_proxy.search_by_rank("melee", "score", self.rank_base + rank - 1, self.rank_base + rank - 1) defer = cache_proxy.execute() defer.addCallback(self._select_players_info, data, melee, players_rank) return defer
def _query_anneal_hard_mode_ranking(self, user_id, req, timer): if req.start_index < 1 or req.start_index > req.end_index: raise Exception("Ranking req error") proxy = DataProxy() proxy.search("anneal", user_id) #先查玩家自己的anneal proxy.search_ranking("anneal", "hard_floor", user_id) #先查玩家自己的排名 proxy.search_by_rank("anneal", "hard_floor", req.start_index - 1, req.end_index - 1) defer = proxy.execute() defer.addCallback(self._calc_query_anneal_hard_mode_ranking, user_id, req, timer) defer.addErrback(self._query_anneal_hard_mode_ranking_failed, req, timer) return defer
def _query_kill_enemy_ranking(self, user_id, req, timer): if req.start_index < 1 or req.start_index > req.end_index: raise Exception("Ranking req error") proxy = DataProxy() proxy.search("trainer", user_id) #先查玩家自己的battle proxy.search_ranking("trainer", "kills", user_id) #先查玩家自己的排名 proxy.search_by_rank("trainer", "kills", req.start_index - 1, req.end_index - 1) defer = proxy.execute() defer.addCallback(self._calc_query_kill_enemy_ranking, user_id, req, timer) defer.addErrback(self._query_kill_enemy_ranking_failed, user_id, req, timer) return defer
def _calc_union_season_battle(self, data, req, timer): if req.start_index < 1 or req.start_index > req.end_index: raise Exception("Ranking req error") union = data.union.get(True) proxy = DataProxy() if union.is_belong_to_union(): proxy.search_ranking("unionseason", "score", union.union_id) proxy.search("unionseason", union.union_id) proxy.search_by_rank("unionseason", "score", req.start_index - 1, req.end_index - 1) defer = proxy.execute() defer.addCallback(self._calc_union_season_battle_post, data, req, timer) defer.addCallback(self._query_succeed, req, timer) return defer
def try_forward_season(self, user_id, request): """尝试进入下一个赛季 """ timer = Timer(user_id) req = union_battle_pb2.TryForwardUnionBattleSeasonReq() req.ParseFromString(request) #查询一下当前赛季排名(联盟排名、个人排名) union_min = min(data_loader.UnionSeasonBattleAwardInfo_dict.keys()) - 1 union_max = max(data_loader.UnionSeasonBattleAwardInfo_dict.keys()) - 1 indiv_min = min( data_loader.UnionSeasonBattleIndivAwardInfo_dict.keys()) - 1 indiv_max = max( data_loader.UnionSeasonBattleIndivAwardInfo_dict.keys()) - 1 proxy = DataProxy() proxy.search_by_rank("unionseason", "score", union_min, union_max) proxy.search_by_rank("union", "season_score", indiv_min, indiv_max) defer = proxy.execute() defer.addCallback(self._calc_season_result, req, union_min, union_max, indiv_min, indiv_max, timer) defer.addErrback(self._try_forward_season_failed, req, timer) return defer