예제 #1
0
    def _pre_select_pvp_rival(self, proxy):
        """初步选择对手
        在可选区间内,初步随机选择 X 名对手
        通常情况下,X > 1,为了避免选择到的对手不合适而需要重新请求
        Args:
            proxy[DataProxy]
        """
        cache_proxy = DataProxy()

        exit_rivals = []
        least_count = 3 #初步选择3人
        for rival in self._pvp_players:
            total_count = proxy.get_rank_score_count(
                    "guard", "score", rival.score_min, rival.score_max)

            if total_count <= 0:
                #对应的区间范围内无合适的 PVP 对手,退化为 PVE
                logger.warning("Invalid rival score range[id=%d][%d-%d]" %
                        (rival.id, rival.score_min, rival.score_max))
                exit_rivals.append(rival)

            random.seed()
            count = min(least_count, total_count)
            offset = random.randint(0, total_count - count)
            rival.set_pvp_filter_range(offset, count)
            cache_proxy.search_by_rank_score("guard", "score",
                    rival.score_min, rival.score_max, rival.offset, rival.count)

        #退化成 PVE 对手
        for rival in exit_rivals:
            self._pvp_convert_to_pve(rival)

        defer = cache_proxy.execute()
        return defer
예제 #2
0
    def _query_arenas_by_ranking(self, status, arena, count, users):
        """按照排名查询竞技场信息
        """
        assert status is True

        cache_proxy = DataProxy()

         #查询玩家所在房间的前count名
        (min_score, max_score) = ArenaInfo.get_index_score_range(arena.index)
        cache_proxy.search_by_rank_score(
                "arena", "score", min_score, max_score, 0, count)

        defer = cache_proxy.execute()
        defer.addCallback(self._query_users, min_score, max_score, count, users)
        return defer
예제 #3
0
    def _get_arena_rank(self, status, data, arena):
        """获得玩家竞技场的排名
        """
        assert status is True

        cache_proxy = DataProxy()
        #查询玩家所在房间的第一名
        (min_score, max_score) = ArenaInfo.get_index_score_range(arena.index)
        cache_proxy.search_by_rank_score(
                "arena", "score", min_score, max_score, 0, 1)
        #查询玩家所在房间人数
        cache_proxy.search_rank_score_count(
                "arena", "score", min_score, max_score)
        defer = cache_proxy.execute()
        defer.addCallback(self._select_arena_rank, data, min_score, max_score)
        return defer
예제 #4
0
    def _query_melee_ranking(self, user_id, req, timer):

        cache_proxy = DataProxy()

        cache_proxy.search("melee", user_id)  #先查玩家自己的melee

        cache_proxy.search_ranking("melee", "score", user_id)  #先查玩家自己的排名
        #拿到房间的积分范围
        scores_range = []
        range = MeleeInfo.get_index_score_range(MeleeInfo.MELEE_INDEX)
        scores_range.append(range)

        for range in scores_range:
            cache_proxy.search_by_rank_score("melee", "score", range[0],
                                             range[1], 0, MELEE_COUNT)

        defer = cache_proxy.execute()
        defer.addCallback(self._calc_query_melee_ranking, user_id,
                          scores_range, req, timer)
        return defer
예제 #5
0
    def _query_official_position_ranking(self, user_id, req, timer):

        cache_proxy = DataProxy()

        cache_proxy.search("arena", user_id)  #先查玩家自己的arena

        #拿到房间的积分范围
        scores_range = []
        range = ArenaInfo.get_index_score_range(ArenaInfo.ARENA_INDEX)
        scores_range.append(range)

        for range in scores_range:
            cache_proxy.search_by_rank_score("arena", "score", range[0],
                                             range[1], 0,
                                             OFFICIAL_POSITION_COUNT)

        defer = cache_proxy.execute()
        defer.addCallback(self._calc_query_official_position_ranking, user_id,
                          scores_range, req, timer)
        return defer