Example #1
0
    def _recruit_tp_1_mode_1(self):
        # 金币单抽
        config = ConfigStaffRecruit.get(1)

        def _remove_money():
            cost = [(money_text_to_item_id('gold'), config.cost_value_1)]

            resource_classify = ResourceClassification.classify(cost)
            resource_classify.check_exist(self.server_id, self.char_id)
            resource_classify.remove(self.server_id, self.char_id, message="StaffRecruit.recruit:1,1")

        if not self.gold_free_times:
            # 没有免费次数了, 就不判断CD,直接扣钱
            _remove_money()
        else:
            # 有免费次数,先判断是否在CD中,
            cd_seconds = self.get_cd_seconds(1)
            if cd_seconds:
                # 在CD中,扣钱
                _remove_money()
            else:
                # 免费的
                # 设置免费次数, 和时间戳
                self.doc['recruit_at']['1'] = arrow.utcnow().timestamp

                MongoStaffRecruit.db(self.server_id).update_one(
                    {'_id': self.char_id},
                    {'$set': {
                        'recruit_at.1': self.doc['recruit_at']['1']
                    }}
                )

                ValueLogStaffRecruitGoldFreeTimes(self.server_id, self.char_id).record()

        return 1
Example #2
0
    def test_refresh_gold(self):
        config = ConfigStaffRecruit.get(RECRUIT_ENUM_TO_CONFIG_ID[RECRUIT_GOLD])
        for i in range(1, config.lucky_times+1):
            self.update(**{'diamond': config.cost_value})
            StaffRecruit(self.server_id, self.char_id).refresh(RECRUIT_GOLD)
            staff_ids = StaffRecruit(self.server_id, self.char_id).get_self_refreshed_staffs()

            quality_s = 0
            quality_a = 0
            quality_b = 0
            for staff_id in staff_ids:
                conf = ConfigStaff.get(int(staff_id))
                if conf.quality == 'S':
                    quality_s += 1
                elif conf.quality == 'A':
                    quality_a += 1
                elif conf.quality == 'B':
                    quality_b += 1

            if i == 1 or i % config.lucky_times == 0:
                assert quality_s == 1
                assert quality_a == 1
                assert quality_b == 6

            else:
                assert quality_a == 2
                assert quality_b == 6
Example #3
0
    def _recruit_tp_2_mode_2(self):
        # 钻石十连抽
        config = ConfigStaffRecruit.get(2)

        cost = [(money_text_to_item_id('diamond'), config.cost_value_10)]

        resource_classify = ResourceClassification.classify(cost)
        resource_classify.check_exist(self.server_id, self.char_id)
        resource_classify.remove(self.server_id, self.char_id, message="StaffRecruit.recruit:2,2")

        return 10
Example #4
0
    def test_refresh_resource_not_enough(self):
        config = ConfigStaffRecruit.get(random.choice(ConfigStaffRecruit.INSTANCES.keys()))
        error = "GOLD_NOT_ENOUGH" if config.cost_type == 1 else "DIAMOND_NOT_ENOUGH"
        tp = RECRUIT_DIAMOND if config.cost_type == 2 else RECRUIT_NORMAL

        try:
            StaffRecruit(self.server_id, self.char_id).refresh(tp)
        except GameException as e:
            assert e.error_id == ConfigErrorMessage.get_error_id(error)
        else:
            raise Exception("can not be here!")
Example #5
0
    def _recruit_tp_2_mode_2(self):
        # 钻石十连抽
        config = ConfigStaffRecruit.get(2)

        cost = [(money_text_to_item_id('diamond'), config.cost_value_10)]

        resource_classify = ResourceClassification.classify(cost)
        resource_classify.check_exist(self.server_id, self.char_id)
        resource_classify.remove(self.server_id,
                                 self.char_id,
                                 message="StaffRecruit.recruit:2,2")

        return 10
Example #6
0
    def test_refresh_by_use_resource(self):
        config = ConfigStaffRecruit.get(random.choice(ConfigStaffRecruit.INSTANCES.keys()))
        cost_type = 'gold' if config.cost_type == 1 else 'diamond'
        self.update(**{cost_type: config.cost_value})

        tp = RECRUIT_NORMAL
        if config.cost_type == 2:
            tp = RECRUIT_GOLD
        if config.cost_type == 3:
            tp = RECRUIT_DIAMOND

        staffs = StaffRecruit(self.server_id, self.char_id).refresh(tp)
        assert len(staffs) > 0
Example #7
0
    def test_recruit(self):
        config = ConfigStaffRecruit.get(RECRUIT_ENUM_TO_CONFIG_ID[RECRUIT_NORMAL])
        cost_type = 'gold' if config.cost_type == 1 else 'diamond'
        self.update(**{cost_type: config.cost_value})
        StaffRecruit(self.server_id, self.char_id).refresh(RECRUIT_NORMAL)

        staff_ids = StaffRecruit(self.server_id, self.char_id).get_self_refreshed_staffs()
        doc = MongoStaff.db(self.server_id).find_one({'_id': self.char_id}, {'staffs': 1})
        test_id = 0
        for staff_id in staff_ids:
            if str(staff_id) not in doc['staffs'].keys():
                test_id = staff_id
                break

        assert StaffManger(self.server_id, self.char_id).has_staff(test_id) is False
        staff_cfg = ConfigStaff.get(test_id)
        tp = 'gold' if staff_cfg.buy_type == 1 else 'diamond'
        self.update(**{tp: staff_cfg.buy_cost})
        StaffRecruit(self.server_id, self.char_id).recruit(test_id)
        assert StaffManger(self.server_id, self.char_id).has_staff(test_id) is True
Example #8
0
    def test_recruit_already_have(self):
        config = ConfigStaffRecruit.get(RECRUIT_ENUM_TO_CONFIG_ID[RECRUIT_NORMAL])
        cost_type = 'gold' if config.cost_type == 1 else 'diamond'
        self.update(**{cost_type: config.cost_value})
        StaffRecruit(self.server_id, self.char_id).refresh(RECRUIT_NORMAL)

        staff_ids = StaffRecruit(self.server_id, self.char_id).get_self_refreshed_staffs()
        doc = MongoStaff.db(self.server_id).find_one({'_id': 1}, {'staffs': 1})
        test_id = 0
        for staff_id in staff_ids:
            if str(staff_id) not in doc['staffs'].keys():
                StaffManger(self.server_id, self.char_id).add(staff_id)
                test_id = staff_id
                break
        try:
            StaffRecruit(self.server_id, self.char_id).recruit(test_id)
        except GameException as e:
            assert e.error_id == ConfigErrorMessage.get_error_id("STAFF_ALREADY_HAVE")
        else:
            raise Exception("can not be here!")
Example #9
0
    def _recruit_tp_2_mode_1(self):
        # 钻石单抽
        config = ConfigStaffRecruit.get(2)

        cd_seconds = self.get_cd_seconds(2)
        if cd_seconds:
            cost = [(money_text_to_item_id('diamond'), config.cost_value_1)]

            resource_classify = ResourceClassification.classify(cost)
            resource_classify.check_exist(self.server_id, self.char_id)
            resource_classify.remove(self.server_id, self.char_id, message="StaffRecruit.recruit:2,1")
        else:
            self.doc['recruit_at']['2'] = arrow.utcnow().timestamp

            MongoStaffRecruit.db(self.server_id).update_one(
                {'_id': self.char_id},
                {'$set': {
                    'recruit_at.2': self.doc['recruit_at']['2']
                }}
            )

        return 1, not bool(cd_seconds)
Example #10
0
    def _recruit_tp_2_mode_1(self):
        # 钻石单抽
        config = ConfigStaffRecruit.get(2)

        cd_seconds = self.get_cd_seconds(2)
        if cd_seconds:
            cost = [(money_text_to_item_id('diamond'), config.cost_value_1)]

            resource_classify = ResourceClassification.classify(cost)
            resource_classify.check_exist(self.server_id, self.char_id)
            resource_classify.remove(self.server_id,
                                     self.char_id,
                                     message="StaffRecruit.recruit:2,1")
        else:
            self.doc['recruit_at']['2'] = arrow.utcnow().timestamp

            MongoStaffRecruit.db(self.server_id).update_one(
                {'_id': self.char_id},
                {'$set': {
                    'recruit_at.2': self.doc['recruit_at']['2']
                }})

        return 1, not bool(cd_seconds)
Example #11
0
    def test_recruit_not_in_list(self):
        config = ConfigStaffRecruit.get(RECRUIT_ENUM_TO_CONFIG_ID[RECRUIT_NORMAL])
        cost_type = 'gold' if config.cost_type == 1 else 'diamond'
        self.update(**{cost_type: config.cost_value})
        StaffRecruit(self.server_id, self.char_id).refresh(RECRUIT_NORMAL)

        config_ids = ConfigStaff.INSTANCES.keys()
        staff_ids = StaffRecruit(self.server_id, self.char_id).get_self_refreshed_staffs()
        doc = MongoStaff.db(self.server_id).find_one({'_id': self.char_id}, {'staffs': 1})
        has_staffs = [int(staff_id) for staff_id in doc['staffs'].keys()]

        staffs_set = set(staff_ids) | set(has_staffs)
        test_id = 0
        for staff_id in config_ids:
            if staff_id not in staffs_set:
                test_id = staff_id
                break
        try:
            StaffRecruit(self.server_id, self.char_id).recruit(test_id)
        except GameException as e:
            assert e.error_id == ConfigErrorMessage.get_error_id("STAFF_RECRUIT_NOT_IN_LIST")
        else:
            raise Exception("can not be here!")
Example #12
0
    def _recruit_tp_1_mode_1(self):
        # 金币单抽
        config = ConfigStaffRecruit.get(1)

        def _remove_money():
            cost = [(money_text_to_item_id('gold'), config.cost_value_1)]

            resource_classify = ResourceClassification.classify(cost)
            resource_classify.check_exist(self.server_id, self.char_id)
            resource_classify.remove(self.server_id,
                                     self.char_id,
                                     message="StaffRecruit.recruit:1,1")

        if not self.gold_free_times:
            # 没有免费次数了, 就不判断CD,直接扣钱
            _remove_money()
        else:
            # 有免费次数,先判断是否在CD中,
            cd_seconds = self.get_cd_seconds(1)
            if cd_seconds:
                # 在CD中,扣钱
                _remove_money()
            else:
                # 免费的
                # 设置免费次数, 和时间戳
                self.doc['recruit_at']['1'] = arrow.utcnow().timestamp

                MongoStaffRecruit.db(self.server_id).update_one(
                    {'_id': self.char_id},
                    {'$set': {
                        'recruit_at.1': self.doc['recruit_at']['1']
                    }})

                ValueLogStaffRecruitGoldFreeTimes(self.server_id,
                                                  self.char_id).record()

        return 1
Example #13
0
    def recruit(self, tp, mode):
        if tp not in [RECRUIT_GOLD, RECRUIT_DIAMOND]:
            raise GameException(ConfigErrorMessage.get_error_id("BAD_MESSAGE"))

        if mode not in [RECRUIT_MODE_1, RECRUIT_MODE_2]:
            raise GameException(ConfigErrorMessage.get_error_id("BAD_MESSAGE"))

        # NOTE: 钻石免费单抽 的积分 要单独处理
        diamond_single_free = False

        if tp == RECRUIT_GOLD:
            if mode == RECRUIT_MODE_1:
                recruit_times = self._recruit_tp_1_mode_1()
            else:
                recruit_times = self._recruit_tp_1_mode_2()

            ValueLogStaffRecruitGoldTimes(self.server_id, self.char_id).record(value=recruit_times)
        else:
            if mode == RECRUIT_MODE_1:
                recruit_times, diamond_single_free = self._recruit_tp_2_mode_1()
            else:
                recruit_times = self._recruit_tp_2_mode_2()

            ValueLogStaffRecruitDiamondTimes(self.server_id, self.char_id).record(value=recruit_times)

        if diamond_single_free:
            converted_tp = 3
        else:
            converted_tp = tp

        config = ConfigStaffRecruit.get(converted_tp)

        # times 3 和 2 还是公用的
        current_times = self.get_times(tp) + 1

        # point 是分开计的
        result = RecruitResult(self.get_point(converted_tp))

        for i in range(current_times, current_times + recruit_times):
            res = config.recruit(result.point, i)
            result.add(res)

        self.doc['point'][str(converted_tp)] = result.point

        # 记录次数
        ValueLogStaffRecruitTimes(self.server_id, self.char_id).record(sub_id=tp, value=recruit_times)

        # 处理积分
        today_score = ValueLogStaffRecruitScore(self.server_id, self.char_id).count_of_today(sub_id=tp)
        can_add_score = config.reward_score_day_limit - today_score
        if can_add_score <= 0:
            # 今天获得的积分已经达到上限
            result.add_score = 0
        else:
            if result.add_score > can_add_score:
                # 要添加的,大于了 能添加的
                result.add_score = can_add_score

        self.doc['score'] += result.add_score
        ValueLogStaffRecruitScore(self.server_id, self.char_id).record(sub_id=tp, value=result.add_score)

        MongoStaffRecruit.db(self.server_id).update_one(
            {'_id': self.char_id},
            {'$set': {
                'point.{0}'.format(converted_tp): result.point,
                'score': self.doc['score']
            }}
        )

        rc = ResourceClassification.classify(result.items)
        rc.add(self.server_id, self.char_id, message="StaffRecruit.recruit:{0},{1}".format(tp, mode))

        if tp == RECRUIT_GOLD:
            recruit_staff_gold_signal.send(
                sender=None,
                server_id=self.server_id,
                char_id=self.char_id,
                times=recruit_times,
                staffs=rc.staff
            )
        else:
            recruit_staff_diamond_signal.send(
                sender=None,
                server_id=self.server_id,
                char_id=self.char_id,
                times=recruit_times,
                staffs=rc.staff
            )

        self.send_notify()
        # NOTE: 结果不能堆叠
        return result.items
Example #14
0
    def recruit(self, tp, mode):
        if tp not in [RECRUIT_GOLD, RECRUIT_DIAMOND]:
            raise GameException(ConfigErrorMessage.get_error_id("BAD_MESSAGE"))

        if mode not in [RECRUIT_MODE_1, RECRUIT_MODE_2]:
            raise GameException(ConfigErrorMessage.get_error_id("BAD_MESSAGE"))

        # NOTE: 钻石免费单抽 的积分 要单独处理
        diamond_single_free = False

        if tp == RECRUIT_GOLD:
            if mode == RECRUIT_MODE_1:
                recruit_times = self._recruit_tp_1_mode_1()
            else:
                recruit_times = self._recruit_tp_1_mode_2()

            ValueLogStaffRecruitGoldTimes(
                self.server_id, self.char_id).record(value=recruit_times)
        else:
            if mode == RECRUIT_MODE_1:
                recruit_times, diamond_single_free = self._recruit_tp_2_mode_1(
                )
            else:
                recruit_times = self._recruit_tp_2_mode_2()

            ValueLogStaffRecruitDiamondTimes(
                self.server_id, self.char_id).record(value=recruit_times)

        if diamond_single_free:
            converted_tp = 3
        else:
            converted_tp = tp

        config = ConfigStaffRecruit.get(converted_tp)

        # times 3 和 2 还是公用的
        current_times = self.get_times(tp) + 1

        # point 是分开计的
        result = RecruitResult(self.get_point(converted_tp))

        for i in range(current_times, current_times + recruit_times):
            res = config.recruit(result.point, i)
            result.add(res)

        self.doc['point'][str(converted_tp)] = result.point

        # 记录次数
        ValueLogStaffRecruitTimes(self.server_id,
                                  self.char_id).record(sub_id=tp,
                                                       value=recruit_times)

        # 处理积分
        today_score = ValueLogStaffRecruitScore(
            self.server_id, self.char_id).count_of_today(sub_id=tp)
        can_add_score = config.reward_score_day_limit - today_score
        if can_add_score <= 0:
            # 今天获得的积分已经达到上限
            result.add_score = 0
        else:
            if result.add_score > can_add_score:
                # 要添加的,大于了 能添加的
                result.add_score = can_add_score

        self.doc['score'] += result.add_score
        ValueLogStaffRecruitScore(self.server_id,
                                  self.char_id).record(sub_id=tp,
                                                       value=result.add_score)

        MongoStaffRecruit.db(self.server_id).update_one(
            {'_id': self.char_id}, {
                '$set': {
                    'point.{0}'.format(converted_tp): result.point,
                    'score': self.doc['score']
                }
            })

        rc = ResourceClassification.classify(result.items)
        rc.add(self.server_id,
               self.char_id,
               message="StaffRecruit.recruit:{0},{1}".format(tp, mode))

        if tp == RECRUIT_GOLD:
            recruit_staff_gold_signal.send(sender=None,
                                           server_id=self.server_id,
                                           char_id=self.char_id,
                                           times=recruit_times,
                                           staffs=rc.staff)
        else:
            recruit_staff_diamond_signal.send(sender=None,
                                              server_id=self.server_id,
                                              char_id=self.char_id,
                                              times=recruit_times,
                                              staffs=rc.staff)

        self.send_notify()
        # NOTE: 结果不能堆叠
        return result.items