예제 #1
0
파일: party.py 프로젝트: yueyoum/dianjing
 def get_info(self):
     return {
         'max_buy_times': GlobalConfig.value("PARTY_BUY_MAX_TIMES"),
         'remained_create_times': self.get_remained_create_times(),
         'remained_join_times': self.get_remained_join_times(),
         'talent_id': self.doc['talent_id'],
     }
예제 #2
0
    def record(self):
        ValueLogUnionExploreTimes(self.server_id, self.char_id).record()
        UnionExploreCD(self.server_id, self.char_id).set(
            GlobalConfig.value("UNION_EXPLORE_CD"))

        self.current_times += 1
        self._calculate()
예제 #3
0
    def create(self, name):
        cost = [(money_text_to_item_id('diamond'),
                 GlobalConfig.value("UNION_CREATE_COST"))]
        rc = ResourceClassification.classify(cost)
        rc.check_exist(self.server_id, self.char_id)

        doc = MongoUnion.document()
        doc['_id'] = make_string_id()
        doc['create_at'] = arrow.utcnow().timestamp
        doc['name'] = name
        doc['owner'] = self.char_id

        try:
            MongoUnion.db(self.server_id).insert_one(doc)
        except DuplicateKeyError:
            raise GameException(
                ConfigErrorMessage.get_error_id("UNION_NAME_HAS_TAKEN"))

        MongoUnionMember.db(self.server_id).update_one({'_id': self.char_id}, {
            '$set': {
                'joined': doc['_id'],
                'joined_at': arrow.utcnow().timestamp
            }
        })

        rc.remove(self.server_id, self.char_id, message="Union.create")
        Union(self.server_id, self.char_id).send_all_notify()
예제 #4
0
파일: plunder.py 프로젝트: yueyoum/dianjing
    def speedup(self):
        if not self.doc['item_id']:
            raise GameException(ConfigErrorMessage.get_error_id("SPECIAL_EQUIPMENT_NOT_IN_PROCESS"))

        seconds = self.doc['finish_at'] - arrow.utcnow().timestamp
        if seconds <= 0:
            raise GameException(ConfigErrorMessage.get_error_id("SPECIAL_EQUIPMENT_ALREADY_FINISHED"))

        minutes, remained = divmod(seconds, 60)
        if remained:
            minutes += 1

        diamond = minutes * GlobalConfig.value("EQUIPMENT_SPECIAL_SPEEDUP_PARAM") * 0.1
        diamond = int(diamond)
        cost = [(money_text_to_item_id('diamond'), diamond)]

        rc = ResourceClassification.classify(cost)
        rc.check_exist(self.server_id, self.char_id)
        rc.remove(self.server_id, self.char_id, message="SpecialEquipmentGenerator.speedup")

        # make sure is finished
        self.doc['finish_at'] = arrow.utcnow().timestamp - 1
        MongoSpecialEquipment.db(self.server_id).update_one(
            {'_id': self.char_id},
            {'$set': {
                'finish_at': self.doc['finish_at']
            }}
        )

        self.send_notify()
예제 #5
0
파일: union.py 프로젝트: yueyoum/dianjing
    def __init__(self, server_id, char_id):
        self.server_id = server_id
        self.char_id = char_id

        self.max_times = GlobalConfig.value("UNION_EXPLORE_TIMES")
        self.current_times = ValueLogUnionExploreTimes(server_id, char_id).count_of_today()
        self._calculate()
예제 #6
0
파일: union.py 프로젝트: yueyoum/dianjing
    def create(self, name):
        cost = [(money_text_to_item_id('diamond'), GlobalConfig.value("UNION_CREATE_COST"))]
        rc = ResourceClassification.classify(cost)
        rc.check_exist(self.server_id, self.char_id)

        doc = MongoUnion.document()
        doc['_id'] = make_string_id()
        doc['create_at'] = arrow.utcnow().timestamp
        doc['name'] = name
        doc['owner'] = self.char_id

        try:
            MongoUnion.db(self.server_id).insert_one(doc)
        except DuplicateKeyError:
            raise GameException(ConfigErrorMessage.get_error_id("UNION_NAME_HAS_TAKEN"))

        MongoUnionMember.db(self.server_id).update_one(
            {'_id': self.char_id},
            {'$set': {
                'joined': doc['_id'],
                'joined_at': arrow.utcnow().timestamp
            }}
        )

        rc.remove(self.server_id, self.char_id, message="Union.create")
        Union(self.server_id, self.char_id).send_all_notify()
예제 #7
0
파일: unit.py 프로젝트: yueyoum/dianjing
    def destroy(self, using_sycee):
        if self.level == UNIT_INIT_LEVEL and self.step == UNIT_INIT_STEP:
            raise GameException(ConfigErrorMessage.get_error_id("UNIT_IS_INIT_CANNOT_DESTROY"))

        if using_sycee:
            need_diamond = GlobalConfig.value("UNIT_DESTROY_SYCEE")
            cost = [(money_text_to_item_id('diamond'), need_diamond), ]
            rc = ResourceClassification.classify(cost)
            rc.check_exist(self.server_id, self.char_id)
            rc.remove(self.server_id, self.char_id, message="Unit.destroy:{0}".format(self.id))

            percent = 1
        else:
            percent = 0.7

        items = self.get_strengthen_cost()
        items = [(_id, int(_amount * percent)) for _id, _amount in items]
        rc = ResourceClassification.classify(items)
        rc.add(self.server_id, self.char_id, message="Unit.destroy:{0}".format(self.id))

        self.level = UNIT_INIT_LEVEL
        self.step = UNIT_INIT_STEP

        MongoUnit.db(self.server_id).update_one(
            {'_id': self.char_id},
            {'$set': {
                'units.{0}.level'.format(self.id): self.level,
                'units.{0}.step'.format(self.id): self.step,
            }}
        )

        return rc
예제 #8
0
 def get_info(self):
     return {
         'max_buy_times': GlobalConfig.value("PARTY_BUY_MAX_TIMES"),
         'remained_create_times': self.get_remained_create_times(),
         'remained_join_times': self.get_remained_join_times(),
         'talent_id': self.doc['talent_id'],
     }
예제 #9
0
    def join(self):
        if self.doc['joined']:
            return

        diamond = GlobalConfig.value("LEVEL_GROWING_ACTIVITY_JOIN_COST_DIAMOND")
        vip_need = GlobalConfig.value("LEVEL_GROWING_ACTIVITY_JOIN_VIP_LIMIT")

        VIP(self.server_id, self.char_id).check(vip_need)

        cost = [(money_text_to_item_id('diamond'), diamond), ]
        rc = ResourceClassification.classify(cost)
        rc.check_exist(self.server_id, self.char_id)
        rc.remove(self.server_id, self.char_id)

        current_level = get_club_property(self.server_id, self.char_id, 'level')
        self._update(current_level, joined=True)
        self.send_notify()
예제 #10
0
    def __init__(self, server_id, char_id):
        self.server_id = server_id
        self.char_id = char_id

        self.max_times = GlobalConfig.value("UNION_EXPLORE_TIMES")
        self.current_times = ValueLogUnionExploreTimes(
            server_id, char_id).count_of_today()
        self._calculate()
예제 #11
0
    def get_reward(self):
        if self.doc['count'] < 1:
            raise GameException(ConfigErrorMessage.get_error_id("INVALID_OPERATE"))

        self.add_count(-1)

        item_id = GlobalConfig.value("PURCHASE_DAILY_REWARD_ITEM_ID")
        rc = ResourceClassification.classify(ConfigItemUse.get(item_id).using_result())
        rc.add(self.server_id, self.char_id)
        return rc
예제 #12
0
파일: union.py 프로젝트: yueyoum/dianjing
    def __init__(self, server_id, char_id):
        self.server_id = server_id
        self.char_id = char_id

        self.max_times = GlobalConfig.value("UNION_HARASS_TIMES")
        self.current_times = ValueLogUnionHarassTimes(server_id, char_id).count_of_today()
        self.current_buy_times = ValueLogUnionHarassBuyTimes(server_id, char_id).count_of_today()

        self.vip_max_buy_times = VIP(server_id, char_id).union_harass_buy_times
        self._calculate()
예제 #13
0
    def auto_increase_product(cls, server_id):
        level_limit = GlobalConfig.value("TERRITORY_BUILDING_AUTO_INCREASE_LEVEL")
        level_condition = {'level': {'$gte': level_limit}}

        char_ids = Club.get_recent_login_char_ids(server_id, other_conditions=[level_condition])
        char_ids = [i for i in char_ids]

        docs = MongoTerritory.db(server_id).find({'_id': {'$in': char_ids}})
        for doc in docs:
            t = Territory(server_id, doc['_id'], doc)
            t.building_auto_increase_product()
예제 #14
0
    def __init__(self, server_id, char_id):
        self.server_id = server_id
        self.char_id = char_id

        self.max_times = GlobalConfig.value("UNION_HARASS_TIMES")
        self.current_times = ValueLogUnionHarassTimes(
            server_id, char_id).count_of_today()
        self.current_buy_times = ValueLogUnionHarassBuyTimes(
            server_id, char_id).count_of_today()

        self.vip_max_buy_times = VIP(server_id, char_id).union_harass_buy_times
        self._calculate()
예제 #15
0
    def join(self):
        if self.doc['joined']:
            return

        diamond = GlobalConfig.value(
            "LEVEL_GROWING_ACTIVITY_JOIN_COST_DIAMOND")
        vip_need = GlobalConfig.value("LEVEL_GROWING_ACTIVITY_JOIN_VIP_LIMIT")

        VIP(self.server_id, self.char_id).check(vip_need)

        cost = [
            (money_text_to_item_id('diamond'), diamond),
        ]
        rc = ResourceClassification.classify(cost)
        rc.check_exist(self.server_id, self.char_id)
        rc.remove(self.server_id, self.char_id)

        current_level = get_club_property(self.server_id, self.char_id,
                                          'level')
        self._update(current_level, joined=True)
        self.send_notify()
예제 #16
0
    def get_reward(self):
        if self.doc['count'] < 1:
            raise GameException(
                ConfigErrorMessage.get_error_id("INVALID_OPERATE"))

        self.add_count(-1)

        item_id = GlobalConfig.value("PURCHASE_DAILY_REWARD_ITEM_ID")
        rc = ResourceClassification.classify(
            ConfigItemUse.get(item_id).using_result())
        rc.add(self.server_id, self.char_id)
        return rc
예제 #17
0
    def auto_increase_product(cls, server_id):
        level_limit = GlobalConfig.value(
            "TERRITORY_BUILDING_AUTO_INCREASE_LEVEL")
        level_condition = {'level': {'$gte': level_limit}}

        char_ids = Club.get_recent_login_char_ids(
            server_id, other_conditions=[level_condition])
        char_ids = [i for i in char_ids]

        docs = MongoTerritory.db(server_id).find({'_id': {'$in': char_ids}})
        for doc in docs:
            t = Territory(server_id, doc['_id'], doc)
            t.building_auto_increase_product()
예제 #18
0
파일: bag.py 프로젝트: yueyoum/dianjing
    def equipment_destroy(self, slot_id, use_sycee):
        # 装备销毁
        """

        :rtype: ResourceClassification
        """
        self._equipment_destroy_check(slot_id)

        this_slot = self.doc['slots'][slot_id]
        item_id = this_slot['item_id']

        config = ConfigEquipmentNew.get(item_id)
        level = this_slot['level']

        equip = Equipment.load_from_slot_data(this_slot)

        if use_sycee:
            if equip.is_special:
                min_level = 0
            else:
                min_level = min(config.levels.keys())

            if level == min_level:
                raise GameException(ConfigErrorMessage.get_error_id("EQUIPMENT_CANNOT_DESTROY_NO_LEVEL_UP"))

            diamond = GlobalConfig.value("EQUIPMENT_DESTROY_SYCEE")
            rf = ResourceClassification.classify([(money_text_to_item_id('diamond'), diamond)])
            rf.check_exist(self.server_id, self.char_id)
            rf.remove(self.server_id, self.char_id)

            MongoBag.db(self.server_id).update_one(
                {'_id': self.char_id},
                {'$set': {
                    'slots.{0}.level'.format(slot_id): 0
                }}
            )
            self.doc['slots'][slot_id]['level'] = 0
            self.send_notify(slot_ids=[slot_id])

            results = equip.get_destroy_back_items(is_normal_destroy=False)
        else:
            self.remove_by_slot_id(slot_id, 1)
            results = equip.get_destroy_back_items(is_normal_destroy=True)
            if config.renown:
                results.append((money_text_to_item_id('renown'), config.renown))

        resource_classified = ResourceClassification.classify(results)
        resource_classified.add(self.server_id, self.char_id, message="Bag.equipment_destroy:{0}".format(item_id))
        return resource_classified
예제 #19
0
파일: common.py 프로젝트: zhifuliu/dianjing
    def post(self, content):
        from core.club import get_club_property

        if self.CD(self.server_id, self.char_id).get_cd_seconds():
            raise GameException(ConfigErrorMessage.get_error_id("CHAT_TOO_FAST"))

        if len(content) > 300:
            raise GameException(ConfigErrorMessage.get_error_id("CHAT_TOO_LARGE"))

        try:
            with self.LOCK(self.server_id, self.char_id).lock(3, 3):
                now = arrow.utcnow().timestamp

                message = {
                    'msg_id': make_string_id(),
                    'club_id': str(self.char_id),
                    'name': get_club_property(self.server_id, self.char_id, 'name'),
                    'content': content,
                    'post_at': now,
                    'approval': 0,
                    'last_update_at': now,
                }

                _data = self.make_notify_data(message=message)
                self.broadcast(_data)

                self.doc['value'].insert(0, message)
                if len(self.doc['value']) > 100:
                    self.doc['value'].sort(key=lambda item: -item['last_update_at'])
                    removed = self.doc['value'].pop(-1)

                    remove_notify = self.REMOVE_NOTIFY()
                    remove_notify.msg_id = removed['msg_id']

                    WinningChatApprovalMark(self.server_id, self.char_id, removed['msg_id']).delete()

                    self.broadcast(MessageFactory.pack(remove_notify))

                MongoCommon.db(self.server_id).update_one(
                    {'_id': self.get_id()},
                    {'$set': {
                        'value': self.doc['value']
                    }}
                )

        except LockTimeOut:
            raise GameException(ConfigErrorMessage.get_error_id("SERVER_BUSY"))

        self.CD(self.server_id, self.char_id).set(GlobalConfig.value("LEADERBOARD_CHAT_INTERVAL"))
예제 #20
0
    def send_notify(self):
        notify = ActivityPurchaseDailyNotify()
        if self.doc['count'] > 0:
            status = ACTIVITY_REWARD
        else:
            if Purchase(self.server_id, self.char_id).get_purchase_info_of_day_shift():
                status = ACTIVITY_COMPLETE
            else:
                status = ACTIVITY_DOING

        notify.status = status
        item_id = GlobalConfig.value("PURCHASE_DAILY_REWARD_ITEM_ID")
        rc = ResourceClassification.classify(ConfigItemUse.get(item_id).using_result())
        notify.items.MergeFrom(rc.make_protomsg())

        MessagePipe(self.char_id).put(msg=notify)
예제 #21
0
    def send_notify(self):
        notify = ActivityPurchaseDailyNotify()
        if self.doc['count'] > 0:
            status = ACTIVITY_REWARD
        else:
            if Purchase(self.server_id,
                        self.char_id).get_purchase_info_of_day_shift():
                status = ACTIVITY_COMPLETE
            else:
                status = ACTIVITY_DOING

        notify.status = status
        item_id = GlobalConfig.value("PURCHASE_DAILY_REWARD_ITEM_ID")
        rc = ResourceClassification.classify(
            ConfigItemUse.get(item_id).using_result())
        notify.items.MergeFrom(rc.make_protomsg())

        MessagePipe(self.char_id).put(msg=notify)
예제 #22
0
파일: tower.py 프로젝트: zhifuliu/dianjing
    def sweep(self):
        sweep_end_at = self.doc.get('sweep_end_at', 0)
        if sweep_end_at:
            raise GameException(ConfigErrorMessage.get_error_id("TOWER_ALREADY_IN_SWEEP"))

        levels_amount = self._sweep_check()
        end_at = arrow.utcnow().timestamp + levels_amount * GlobalConfig.value("TOWER_SWEEP_SECONDS_PER_LEVEL")

        self.doc['sweep_end_at'] = end_at
        MongoTower.db(self.server_id).update_one(
            {'_id': self.char_id},
            {'$set': {
                'sweep_end_at': end_at
            }}
        )

        ValueLogTowerWinTimes(self.server_id, self.char_id).record(value=levels_amount)
        self.send_notify(act=ACT_UPDATE, levels=[])
예제 #23
0
    def destroy(self, using_sycee):
        if self.level == UNIT_INIT_LEVEL and self.step == UNIT_INIT_STEP:
            raise GameException(
                ConfigErrorMessage.get_error_id("UNIT_IS_INIT_CANNOT_DESTROY"))

        if using_sycee:
            need_diamond = GlobalConfig.value("UNIT_DESTROY_SYCEE")
            cost = [
                (money_text_to_item_id('diamond'), need_diamond),
            ]
            rc = ResourceClassification.classify(cost)
            rc.check_exist(self.server_id, self.char_id)
            rc.remove(self.server_id,
                      self.char_id,
                      message="Unit.destroy:{0}".format(self.id))

            percent = 1
        else:
            percent = 0.7

        items = self.get_strengthen_cost()
        items = [(_id, int(_amount * percent)) for _id, _amount in items]
        rc = ResourceClassification.classify(items)
        rc.add(self.server_id,
               self.char_id,
               message="Unit.destroy:{0}".format(self.id))

        self.level = UNIT_INIT_LEVEL
        self.step = UNIT_INIT_STEP

        MongoUnit.db(self.server_id).update_one({'_id': self.char_id}, {
            '$set': {
                'units.{0}.level'.format(self.id): self.level,
                'units.{0}.step'.format(self.id): self.step,
            }
        })

        return rc
예제 #24
0
    def __init__(self, server_id, char_id):
        self.server_id = server_id
        self.char_id = char_id

        self.is_active = Challenge(server_id, char_id).is_challenge_id_passed(
            GlobalConfig.value("PLUNDER_ACTIVE_CHALLENGE_ID"))

        self.doc = MongoPlunder.db(self.server_id).find_one(
            {'_id': self.char_id})
        if not self.doc:
            self.doc = MongoPlunder.document()
            self.doc['_id'] = self.char_id
            self.doc['plunder_remained_times'] = PLUNDER_TIMES_INIT_TIMES
            MongoPlunder.db(self.server_id).insert_one(self.doc)

        _, today_daily_reward_info = self.get_daily_reward_info()
        if not today_daily_reward_info:
            # 可以清理数据
            self.doc['daily_reward'] = {}
            MongoPlunder.db(self.server_id).update_one(
                {'_id': self.char_id}, {'$set': {
                    'daily_reward': {}
                }})
예제 #25
0
    def speedup(self):
        if not self.doc['item_id']:
            raise GameException(
                ConfigErrorMessage.get_error_id(
                    "SPECIAL_EQUIPMENT_NOT_IN_PROCESS"))

        seconds = self.doc['finish_at'] - arrow.utcnow().timestamp
        if seconds <= 0:
            raise GameException(
                ConfigErrorMessage.get_error_id(
                    "SPECIAL_EQUIPMENT_ALREADY_FINISHED"))

        minutes, remained = divmod(seconds, 60)
        if remained:
            minutes += 1

        diamond = minutes * GlobalConfig.value(
            "EQUIPMENT_SPECIAL_SPEEDUP_PARAM") * 0.1
        diamond = int(diamond)
        cost = [(money_text_to_item_id('diamond'), diamond)]

        rc = ResourceClassification.classify(cost)
        rc.check_exist(self.server_id, self.char_id)
        rc.remove(self.server_id,
                  self.char_id,
                  message="SpecialEquipmentGenerator.speedup")

        # make sure is finished
        self.doc['finish_at'] = arrow.utcnow().timestamp - 1
        MongoSpecialEquipment.db(self.server_id).update_one(
            {'_id': self.char_id},
            {'$set': {
                'finish_at': self.doc['finish_at']
            }})

        self.send_notify()
예제 #26
0
파일: plunder.py 프로젝트: yueyoum/dianjing
    def __init__(self, server_id, char_id):
        self.server_id = server_id
        self.char_id = char_id

        self.is_active = Challenge(server_id, char_id).is_challenge_id_passed(
            GlobalConfig.value("PLUNDER_ACTIVE_CHALLENGE_ID"))

        self.doc = MongoPlunder.db(self.server_id).find_one({'_id': self.char_id})
        if not self.doc:
            self.doc = MongoPlunder.document()
            self.doc['_id'] = self.char_id
            self.doc['plunder_remained_times'] = PLUNDER_TIMES_INIT_TIMES
            MongoPlunder.db(self.server_id).insert_one(self.doc)

        _, today_daily_reward_info = self.get_daily_reward_info()
        if not today_daily_reward_info:
            # 可以清理数据
            self.doc['daily_reward'] = {}
            MongoPlunder.db(self.server_id).update_one(
                {'_id': self.char_id},
                {'$set': {
                    'daily_reward': {}
                }}
            )
예제 #27
0
 def set_search_cd(self):
     cd = GlobalConfig.value("PLUNDER_SEARCH_CD")
     PlunderSearchCD(self.server_id, self.char_id).set(cd)
예제 #28
0
파일: union.py 프로젝트: yueyoum/dianjing
    def record(self):
        ValueLogUnionExploreTimes(self.server_id, self.char_id).record()
        UnionExploreCD(self.server_id, self.char_id).set(GlobalConfig.value("UNION_EXPLORE_CD"))

        self.current_times += 1
        self._calculate()
예제 #29
0
파일: chat.py 프로젝트: zhifuliu/dianjing
    def normal_chat(self, channel, text):
        from tasks import world

        char_doc = MongoCharacter.db(self.server_id).find_one(
            {'_id': self.char_id},
            {'name': 1, 'vip': 1, 'level': 1}
        )

        union_id = 0
        if channel == CHAT_CHANNEL_PUBLIC:
            if char_doc['level'] < GlobalConfig.value("CHAT_LEVEL_LIMIT"):
                raise GameException(ConfigErrorMessage.get_error_id("CHAT_LEVEL_NOT_ENOUGH"))

            if ChatCD(self.server_id, self.char_id).get_cd_seconds():
                raise GameException(ConfigErrorMessage.get_error_id("CHAT_TOO_FAST"))

            if len(text) > CHAT_MAX_SIZE:
                raise GameException(ConfigErrorMessage.get_error_id("CHAT_TOO_LARGE"))

            ChatCD(self.server_id, self.char_id).set(GlobalConfig.value("CHAT_CD"))

        elif channel == CHAT_CHANNEL_UNION:
            union_id = Union(self.server_id, self.char_id).get_joined_union_id()
            if not union_id:
                raise GameException(ConfigErrorMessage.get_error_id("UNION_CHAT_NO_UNION"))
        else:
            raise GameException(ConfigErrorMessage.get_error_id("BAD_MESSAGE"))

        # 创建一个消息
        msg = ChatMessage()
        msg.channel = channel
        msg.club.id = str(self.char_id)
        msg.club.name = char_doc['name']
        msg.club.vip = VIP(self.server_id, self.char_id).level
        msg.msg = text
        data = base64.b64encode(msg.SerializeToString())

        # 立即通知自己
        notify = ChatNotify()
        notify.act = ACT_UPDATE
        notify_msg = notify.msgs.add()
        notify_msg.MergeFrom(msg)

        notify_bin = MessageFactory.pack(notify)
        MessagePipe(self.char_id).put(data=notify_bin)

        # 放入公共空间,让后面登陆的人都能看到
        # 等于离线消息
        if channel == CHAT_CHANNEL_PUBLIC:
            CommonPublicChat(self.server_id).push(data, slice_amount=20)
            # 给其他人广播通知
            arg = {
                'server_id': self.server_id,
                'exclude_chars': [self.char_id],
                'data': MessageFactory.pack(notify)
            }

            payload = cPickle.dumps(arg)
            world.broadcast(payload=payload)
        else:
            CommonUnionChat(self.server_id, union_id).push(data, slice_amount=20)
            arg = {
                'server_id': self.server_id,
                'exclude_chars': [self.char_id],
                'data': MessageFactory.pack(notify),
                'char_id': self.char_id
            }

            payload = cPickle.dumps(arg)
            world.broadcast_union_chat(payload=payload)

        chat_signal.send(
            sender=None,
            server_id=self.server_id,
            char_id=self.char_id
        )
예제 #30
0
파일: plunder.py 프로젝트: yueyoum/dianjing
    def get_result(self):
        if not self.doc['item_id']:
            raise GameException(ConfigErrorMessage.get_error_id("SPECIAL_EQUIPMENT_NOT_IN_PROCESS"))

        if arrow.utcnow().timestamp < self.doc['finish_at']:
            raise GameException(ConfigErrorMessage.get_error_id("SPECIAL_EQUIPMENT_NOT_FINISH"))

        tp = self.doc['tp']
        score = self.doc['score'][str(tp)]
        growing = ConfigEquipmentSpecialScoreToGrowing.get_random_growing_by_score(tp, score)

        config_generate = ConfigEquipmentSpecialGenerate.get(self.doc['item_id'])

        if tp == SPECIAL_EQUIPMENT_GENERATE_NORMAL:
            equip_id = random.choice(config_generate.normal_generate)
            if growing >= GlobalConfig.value("EQUIPMENT_SPECIAL_NORMAL_SCORE_RESET_AT"):
                new_score = 0
            else:
                new_score = score + 1
        else:
            equip_id = random.choice(config_generate.advance_generate)
            if growing >= GlobalConfig.value("EQUIPMENT_SPECIAL_ADVANCE_SCORE_RESET_AT"):
                new_score = 0
            else:
                new_score = score + 1

        config_property = ConfigEquipmentSpecialGrowingProperty.get_by_growing(growing)
        config_equipment = ConfigEquipmentSpecial.get(equip_id)

        properties = []
        for k, v in PROPERTY_TO_NAME_MAP.iteritems():
            if k in SPECIAL_EQUIPMENT_BASE_PROPERTY:
                continue

            if getattr(config_equipment, v, 0):
                properties.append(k)

        equip_properties = []
        for _ in config_property.property_active_levels:
            p = random.choice(properties)
            equip_properties.append(p)

        equip_skills = []
        for _ in config_property.skill_active_levels:
            s = random.choice(config_equipment.skills)
            equip_skills.append(s)

        equip_obj = Equipment.initialize_for_special(equip_id, self.doc['item_id'], tp, growing, equip_properties,
                                                     equip_skills)
        bag = Bag(self.server_id, self.char_id)
        bag.add_equipment_object(equip_obj)

        self.doc['item_id'] = 0
        self.doc['finish_at'] = 0
        self.doc['tp'] = 0
        self.doc['score'][str(tp)] = new_score

        MongoSpecialEquipment.db(self.server_id).update_one(
            {'_id': self.char_id},
            {'$set': {
                'item_id': 0,
                'finish_at': 0,
                'tp': 0,
                'score.{0}'.format(tp): new_score
            }}
        )

        ValueLogSpecialEquipmentGenerateTimes(self.server_id, self.char_id).record()
        self.send_notify()

        return equip_obj
예제 #31
0
파일: plunder.py 프로젝트: yueyoum/dianjing
 def set_search_cd(self):
     cd = GlobalConfig.value("PLUNDER_SEARCH_CD")
     PlunderSearchCD(self.server_id, self.char_id).set(cd)
예제 #32
0
파일: plunder.py 프로젝트: yueyoum/dianjing
    def search(self, check_cd=True, replace_search_index=None, send_notify=True):
        if check_cd and self.get_search_cd():
            raise GameException(ConfigErrorMessage.get_error_id("PLUNDER_SEARCH_IN_CD"))

        def _query_real(_level_low, _level_high):
            _skip_char_ids = [_s['id'] for _s in self.doc['search']]
            _skip_char_ids.append(self.char_id)

            _condition = {'$and': [
                {'_id': {'$nin': _skip_char_ids}},
                {'level': {'$gte': _level_low}},
                {'level': {'$lte': _level_high}}
            ]}

            _docs = MongoCharacter.db(self.server_id).find(_condition, {'_id': 1})
            _ids = []
            for _doc in _docs:
                _ids.append(_doc['_id'])

            return _ids

        self_club_level = get_club_property(self.server_id, self.char_id, 'level')
        level_low = self_club_level - GlobalConfig.value("PLUNDER_SEARCH_LEVEL_RANGE_LOW")
        level_high = self_club_level + GlobalConfig.value("PLUNDER_SEARCH_LEVEL_RANGE_HIGH")

        real_ids = _query_real(level_low, level_high)
        # filter by active and loss_percent
        condition = {'$and': [
            {'_id': {'$in': real_ids}},
            {'active': True},
            {'loss_percent': {'$lt': PLUNDER_MAX_LOST}}
        ]}

        docs = MongoPlunder.db(self.server_id).find(condition, {'_id': 1})
        result_ids = []
        for doc in docs:
            if PlunderMatchCD(self.server_id, self.char_id, doc['_id']).get_cd_seconds():
                continue

            result_ids.append(doc['_id'])

        random.shuffle(result_ids)

        search_docs = []
        for i in result_ids:
            search_docs.append({'id': i, 'spied': False})
            if len(search_docs) == 2:
                break

        need_npc_amount = 2 - len(search_docs)
        if need_npc_amount:
            for i in range(need_npc_amount):
                config_plunder_npc = ConfigPlunderNPC.get_by_level(self_club_level)
                npc_doc = config_plunder_npc.to_doc(self.doc['level'])

                search_docs.append(npc_doc)

        if replace_search_index:
            self.doc['search'][replace_search_index] = search_docs[0]
            updater = {
                'search.{0}'.format(replace_search_index): self.doc['search'][replace_search_index]
            }
        else:
            self.doc['search'] = search_docs
            updater = {'search': search_docs}

        MongoPlunder.db(self.server_id).update_one(
            {'_id': self.char_id},
            {'$set': updater}
        )

        if check_cd:
            self.set_search_cd()

        if send_notify:
            self.send_search_notify()
예제 #33
0
파일: plunder.py 프로젝트: yueyoum/dianjing
    def plunder_start(self, _id, tp, formation_slots=None, win=None):
        if tp not in [PLUNDER_TYPE_PLUNDER, PLUNDER_TYPE_REVENGE]:
            raise GameException(ConfigErrorMessage.get_error_id("BAD_MESSAGE"))

        for i in [0, 1, 2]:
            if self.doc['matching']['result'][i] == 0:
                way = i + 1
                break
        else:
            # 都打完了
            raise GameException(ConfigErrorMessage.get_error_id("PLUNDER_MATCH_ALL_FINISHED"))

        target_id = self.doc['matching']['id']
        if not target_id:
            if tp == PLUNDER_TYPE_PLUNDER:
                _index = self.find_search_target_index_by_target_id(_id)
                target_id = self.doc['search'][_index]['id']
            else:
                _index = self.find_revenge_target_index_by_target_id(_id)
                target_id = self.doc['revenge_list'][_index][0]
        else:
            # 要保证target_id 一样
            if str(target_id) != _id:
                raise GameException(ConfigErrorMessage.get_error_id("PLUNDER_TARGET_ID_NOT_SAME"))

        updater = {}
        if not self.doc['matching']['id']:
            self.doc['matching']['id'] = target_id
            self.doc['matching']['tp'] = tp
            updater['matching.id'] = target_id
            updater['matching.tp'] = tp

        if way == 1:
            # 开始的第一路,这时候要判断次数
            if tp == PLUNDER_TYPE_PLUNDER:
                if not self.doc['plunder_remained_times']:
                    self.buy_plunder_times()

                PlunderMatchCD(self.server_id, self.char_id, target_id).set(GlobalConfig.value("PLUNDER_MATCH_CD"))

            else:
                if not self.get_revenge_remained_times():
                    raise GameException(ConfigErrorMessage.get_error_id("PLUNDER_REVENGE_NO_TIMES"))

                self.send_revenge_notify()

        if updater:
            MongoPlunder.db(self.server_id).update_one(
                {'_id': self.char_id},
                {'$set': updater}
            )

        if win is not None:
            self.plunder_report(way, win)
            return None

        my_way = self.get_way_object(way)
        if formation_slots:
            my_way.sync_slots(formation_slots)
            my_way.load_formation_staffs()
            self.send_formation_notify()

        my_club = Club(self.server_id, self.char_id, load_staffs=False)
        my_club.formation_staffs = my_way.formation_staffs

        match = ClubMatch(my_club, None, 3, my_way.get_skill_sequence(), {})
        msg = match.start(auto_load_staffs=False)
        msg.key = str(way)
        msg.map_name = GlobalConfig.value_string("MATCH_MAP_PLUNDER")

        return msg
예제 #34
0
    def get_result(self):
        if not self.doc['item_id']:
            raise GameException(
                ConfigErrorMessage.get_error_id(
                    "SPECIAL_EQUIPMENT_NOT_IN_PROCESS"))

        if arrow.utcnow().timestamp < self.doc['finish_at']:
            raise GameException(
                ConfigErrorMessage.get_error_id(
                    "SPECIAL_EQUIPMENT_NOT_FINISH"))

        tp = self.doc['tp']
        score = self.doc['score'][str(tp)]
        growing = ConfigEquipmentSpecialScoreToGrowing.get_random_growing_by_score(
            tp, score)

        config_generate = ConfigEquipmentSpecialGenerate.get(
            self.doc['item_id'])

        if tp == SPECIAL_EQUIPMENT_GENERATE_NORMAL:
            equip_id = random.choice(config_generate.normal_generate)
            if growing >= GlobalConfig.value(
                    "EQUIPMENT_SPECIAL_NORMAL_SCORE_RESET_AT"):
                new_score = 0
            else:
                new_score = score + 1
        else:
            equip_id = random.choice(config_generate.advance_generate)
            if growing >= GlobalConfig.value(
                    "EQUIPMENT_SPECIAL_ADVANCE_SCORE_RESET_AT"):
                new_score = 0
            else:
                new_score = score + 1

        config_property = ConfigEquipmentSpecialGrowingProperty.get_by_growing(
            growing)
        config_equipment = ConfigEquipmentSpecial.get(equip_id)

        properties = []
        for k, v in PROPERTY_TO_NAME_MAP.iteritems():
            if k in SPECIAL_EQUIPMENT_BASE_PROPERTY:
                continue

            if getattr(config_equipment, v, 0):
                properties.append(k)

        equip_properties = []
        for _ in config_property.property_active_levels:
            p = random.choice(properties)
            equip_properties.append(p)

        equip_skills = []
        for _ in config_property.skill_active_levels:
            s = random.choice(config_equipment.skills)
            equip_skills.append(s)

        equip_obj = Equipment.initialize_for_special(equip_id,
                                                     self.doc['item_id'], tp,
                                                     growing, equip_properties,
                                                     equip_skills)
        bag = Bag(self.server_id, self.char_id)
        bag.add_equipment_object(equip_obj)

        self.doc['item_id'] = 0
        self.doc['finish_at'] = 0
        self.doc['tp'] = 0
        self.doc['score'][str(tp)] = new_score

        MongoSpecialEquipment.db(self.server_id).update_one(
            {'_id': self.char_id}, {
                '$set': {
                    'item_id': 0,
                    'finish_at': 0,
                    'tp': 0,
                    'score.{0}'.format(tp): new_score
                }
            })

        ValueLogSpecialEquipmentGenerateTimes(self.server_id,
                                              self.char_id).record()
        self.send_notify()

        return equip_obj
예제 #35
0
파일: arena.py 프로젝트: yueyoum/dianjing
    def report(self, key, win):
        rival_id = key

        my_rank = self.get_current_rank()
        my_max_rank = self.get_max_rank()

        doc = MongoArena.db(self.server_id).find_one(
            {'_id': str(self.char_id)},
            {
                'search_index': 1,
                'continue_win': 1,
            }
        )

        ArenaRefreshCD(self.server_id, self.char_id).clean()
        ArenaMatchCD(self.server_id, self.char_id, rival_id).set(GlobalConfig.value("ARENA_MATCH_CD"))

        config_search = ConfigArenaSearchRange.get(doc['search_index'])
        if win:
            score_changed = config_search.score_win
            new_search_index = doc['search_index'] + 1
            continue_win = doc.get('continue_win', 0) + 1
        else:
            score_changed = -config_search.score_lose
            new_search_index = doc['search_index'] - 1
            continue_win = 0

        if new_search_index > ConfigArenaSearchRange.MAX_INDEX:
            new_search_index = ConfigArenaSearchRange.MAX_INDEX
        if new_search_index < 0:
            new_search_index = 0

        MongoArena.db(self.server_id).update_one(
            {'_id': str(self.char_id)},
            {
                '$set': {
                    'search_index': new_search_index,
                    'rival': 0,
                    'continue_win': continue_win,
                },
                '$inc': {
                    'match_times': 1,
                }
            }
        )

        ass = ArenaScore(self.server_id, self.char_id)
        score_changed = ass.add_score(score_changed)

        new_rank = ass.rank
        max_rank_changed = False

        if new_rank > my_max_rank:
            my_max_rank = new_rank

            MongoArena.db(self.server_id).update_one(
                {'_id': str(self.char_id)},
                {'$set': {'max_rank': new_rank}}
            )

            max_rank_changed = True

        rank_changed = new_rank - my_rank

        rival_rank = Arena(self.server_id, rival_id).get_current_rank()

        if win:
            ValueLogArenaWinTimes(self.server_id, self.char_id).record()
            config_reward = ConfigArenaMatchReward.get(1)
        else:
            config_reward = ConfigArenaMatchReward.get(2)

        ValueLogArenaHonorPoints(self.server_id, self.char_id).record(value=config_reward.honor)
        ValueLogArenaMatchTimes(self.server_id, self.char_id).record()

        drop = config_reward.get_drop()
        resource_classified = ResourceClassification.classify(drop)
        resource_classified.add(self.server_id, self.char_id, message="Arena.report:{0}".format(win))

        self.send_honor_notify()
        self.send_notify()

        arena_match_signal.send(
            sender=None,
            server_id=self.server_id,
            char_id=self.char_id,
            target_id=rival_id,
            target_name=ArenaClub(self.server_id, rival_id).name,
            my_rank=new_rank,
            target_rank=rival_rank,
            win=win,
            continue_win=continue_win,
        )

        if max_rank_changed:
            task_condition_trig_signal.send(
                sender=None,
                server_id=self.server_id,
                char_id=self.char_id,
                condition_name='core.arena.Arena'
            )

        WinningArena(self.server_id, self.char_id).set(win)

        return resource_classified, score_changed, -rank_changed, my_max_rank, new_rank, ass.score
예제 #36
0
    def sweep(self, challenge_id, tp):
        # 扫荡
        config = ConfigChallengeMatch.get(challenge_id)
        if not config:
            raise GameException(ConfigErrorMessage.get_error_id("CHALLENGE_NOT_EXIST"))

        doc = MongoChallenge.db(self.server_id).find_one(
            {'_id': self.char_id},
            {
                'challenge_star.{0}'.format(challenge_id): 1,
                'challenge_drop.{0}'.format(challenge_id): 1,
            }
        )

        star = doc['challenge_star'].get(str(challenge_id), None)
        if star is None:
            raise GameException(ConfigErrorMessage.get_error_id("CHALLENGE_NOT_OPEN"))
        if star != 3:
            raise GameException(ConfigErrorMessage.get_error_id("CHALLENGE_NOT_3_STAR"))

        if tp == CHALLENGE_SWEEP_TYPE_ONE:
            sweep_times = 1
        else:
            sweep_times = 10
            need_vip_level = GlobalConfig.value("CHALLENGE_SWEEP_10_VIP_LEVEL")
            VIP(self.server_id, self.char_id).check(need_vip_level)

        rt = RemainedTimes(self.server_id, self.char_id, challenge_id)
        if not rt.remained_match_times:
            raise GameException(ConfigErrorMessage.get_error_id("CHALLENGE_WITHOUT_TIMES"))

        # 剩余次数限制
        if rt.remained_match_times < sweep_times:
            sweep_times = rt.remained_match_times

        # 体力限制
        en = Energy(self.server_id, self.char_id)
        # NOTE 要保证至少可以打一次!
        en.check(config.energy)

        current_energy_can_sweep_times = en.energy / config.energy
        if sweep_times > current_energy_can_sweep_times:
            sweep_times = current_energy_can_sweep_times

        en.remove(sweep_times * config.energy)

        drop_times = doc['challenge_drop'].get(str(challenge_id), {})
        drops = {}
        resource_classified_list = []
        for i in range(sweep_times):
            _drop = config.get_drop(drop_times)
            for _id, _amount in _drop:
                if _id in drops:
                    drops[_id] += _amount
                else:
                    drops[_id] = _amount

            resource_classified_list.append(ResourceClassification.classify(_drop))

        MongoChallenge.db(self.server_id).update_one(
            {'_id': self.char_id},
            {'$set': {
                'challenge_drop.{0}'.format(challenge_id): drop_times
            }}
        )

        ValueLogChallengeMatchTimes(self.server_id, self.char_id).record(sub_id=challenge_id, value=sweep_times)
        ValueLogAllChallengeWinTimes(self.server_id, self.char_id).record(value=sweep_times)

        resource_classified = ResourceClassification.classify(drops.items())
        resource_classified.add(self.server_id, self.char_id, message="Challenge.sweep:{0}".format(challenge_id))

        self.send_challenge_notify(ids=[challenge_id])
        return resource_classified_list
예제 #37
0
    def search(self,
               check_cd=True,
               replace_search_index=None,
               send_notify=True):
        if check_cd and self.get_search_cd():
            raise GameException(
                ConfigErrorMessage.get_error_id("PLUNDER_SEARCH_IN_CD"))

        def _query_real(_level_low, _level_high):
            _skip_char_ids = [_s['id'] for _s in self.doc['search']]
            _skip_char_ids.append(self.char_id)

            _condition = {
                '$and': [{
                    '_id': {
                        '$nin': _skip_char_ids
                    }
                }, {
                    'level': {
                        '$gte': _level_low
                    }
                }, {
                    'level': {
                        '$lte': _level_high
                    }
                }]
            }

            _docs = MongoCharacter.db(self.server_id).find(
                _condition, {'_id': 1})
            _ids = []
            for _doc in _docs:
                _ids.append(_doc['_id'])

            return _ids

        self_club_level = get_club_property(self.server_id, self.char_id,
                                            'level')
        level_low = self_club_level - GlobalConfig.value(
            "PLUNDER_SEARCH_LEVEL_RANGE_LOW")
        level_high = self_club_level + GlobalConfig.value(
            "PLUNDER_SEARCH_LEVEL_RANGE_HIGH")

        real_ids = _query_real(level_low, level_high)
        # filter by active and loss_percent
        condition = {
            '$and': [{
                '_id': {
                    '$in': real_ids
                }
            }, {
                'active': True
            }, {
                'loss_percent': {
                    '$lt': PLUNDER_MAX_LOST
                }
            }]
        }

        docs = MongoPlunder.db(self.server_id).find(condition, {'_id': 1})
        result_ids = []
        for doc in docs:
            if PlunderMatchCD(self.server_id, self.char_id,
                              doc['_id']).get_cd_seconds():
                continue

            result_ids.append(doc['_id'])

        random.shuffle(result_ids)

        search_docs = []
        for i in result_ids:
            search_docs.append({'id': i, 'spied': False})
            if len(search_docs) == 2:
                break

        need_npc_amount = 2 - len(search_docs)
        if need_npc_amount:
            for i in range(need_npc_amount):
                config_plunder_npc = ConfigPlunderNPC.get_by_level(
                    self_club_level)
                npc_doc = config_plunder_npc.to_doc(self.doc['level'])

                search_docs.append(npc_doc)

        if replace_search_index:
            self.doc['search'][replace_search_index] = search_docs[0]
            updater = {
                'search.{0}'.format(replace_search_index):
                self.doc['search'][replace_search_index]
            }
        else:
            self.doc['search'] = search_docs
            updater = {'search': search_docs}

        MongoPlunder.db(self.server_id).update_one({'_id': self.char_id},
                                                   {'$set': updater})

        if check_cd:
            self.set_search_cd()

        if send_notify:
            self.send_search_notify()
예제 #38
0
파일: tower.py 프로젝트: zhifuliu/dianjing
    def sweep_finish(self):
        # 加速或者领奖 都是这一个协议

        start_level = self.get_current_level()
        sweep_end_at = self.doc.get('sweep_end_at', 0)
        if sweep_end_at == 0:
            # 没有扫荡过,直接 完成
            levels_amount = self._sweep_check()
        else:
            # 已经扫荡了, 现在要加速完成
            need_seconds = sweep_end_at - arrow.utcnow().timestamp
            if need_seconds <= 0:
                # 已经完成了, 直接领奖
                levels_amount = 0
            else:
                levels_amount, _remained = divmod(need_seconds, GlobalConfig.value("TOWER_SWEEP_SECONDS_PER_LEVEL"))
                if _remained:
                    levels_amount += 1

        if levels_amount:
            need_diamond = levels_amount * GlobalConfig.value("TOWER_SWEEP_DIAMOND_PER_LEVEL")
            resource_classified = ResourceClassification.classify([(money_text_to_item_id('diamond'), need_diamond)])
            resource_classified.check_exist(self.server_id, self.char_id)
            resource_classified.remove(self.server_id, self.char_id, message="Tower.sweep_finish")

        drops = {}
        updater = {}
        for i in range(start_level, self.doc['max_star_level'] + 1):
            updater['levels.{0}'.format(i)] = 3
            self.doc['levels'][str(i)] = 3
            self.doc['current_star'] += 3

            config = ConfigTowerLevel.get(i)
            drop = config.get_star_reward(3)
            for _id, _amount in drop:
                if _id in drops:
                    drops[_id] += _amount
                else:
                    drops[_id] = _amount

            turntable = config.get_turntable()
            if turntable:
                if self.doc['current_star'] >= 9:
                    got = random.choice(turntable['9'])
                    self.doc['talents'].append(got)
                    self.doc['current_star'] -= 9

                elif self.doc['current_star'] >= 6:
                    got = random.choice(turntable['6'])
                    self.doc['talents'].append(got)
                    self.doc['current_star'] -= 6

                elif self.doc['current_star'] >= 3:
                    got = random.choice(turntable['3'])
                    self.doc['talents'].append(got)
                    self.doc['current_star'] -= 3

            goods = config.get_sale_goods()
            if goods:
                self.doc['goods'].append([goods[0], 0])
                self.doc['goods'].append([goods[1], 0])

        self.doc['sweep_end_at'] = 0
        updater['sweep_end_at'] = 0
        updater['current_star'] = self.doc['current_star']
        updater['talents'] = self.doc['talents']
        updater['goods'] = self.doc['goods']

        # 扫荡完下一关要可打
        next_level = self.doc['max_star_level'] + 1
        if next_level <= ConfigTowerLevel.MAX_LEVEL:
            self.doc['levels'][str(next_level)] = 0
            updater['levels.{0}'.format(next_level)] = 0

        self.set_today_max_star()

        total_star = self.get_total_current_star()
        if total_star > self.doc['history_max_star']:
            self.doc['history_max_star'] = total_star
            updater['history_max_star'] = total_star

        MongoTower.db(self.server_id).update_one(
            {'_id': self.char_id},
            {'$set': updater}
        )

        resource_classified = ResourceClassification.classify(drops.items())
        resource_classified.add(self.server_id, self.char_id, message="Tower.sweep_finish")

        self.send_notify(act=ACT_UPDATE)
        self.send_goods_notify()
        return resource_classified
예제 #39
0
    def plunder_start(self, _id, tp, formation_slots=None, win=None):
        if tp not in [PLUNDER_TYPE_PLUNDER, PLUNDER_TYPE_REVENGE]:
            raise GameException(ConfigErrorMessage.get_error_id("BAD_MESSAGE"))

        for i in [0, 1, 2]:
            if self.doc['matching']['result'][i] == 0:
                way = i + 1
                break
        else:
            # 都打完了
            raise GameException(
                ConfigErrorMessage.get_error_id("PLUNDER_MATCH_ALL_FINISHED"))

        target_id = self.doc['matching']['id']
        if not target_id:
            if tp == PLUNDER_TYPE_PLUNDER:
                _index = self.find_search_target_index_by_target_id(_id)
                target_id = self.doc['search'][_index]['id']
            else:
                _index = self.find_revenge_target_index_by_target_id(_id)
                target_id = self.doc['revenge_list'][_index][0]
        else:
            # 要保证target_id 一样
            if str(target_id) != _id:
                raise GameException(
                    ConfigErrorMessage.get_error_id(
                        "PLUNDER_TARGET_ID_NOT_SAME"))

        updater = {}
        if not self.doc['matching']['id']:
            self.doc['matching']['id'] = target_id
            self.doc['matching']['tp'] = tp
            updater['matching.id'] = target_id
            updater['matching.tp'] = tp

        if way == 1:
            # 开始的第一路,这时候要判断次数
            if tp == PLUNDER_TYPE_PLUNDER:
                if not self.doc['plunder_remained_times']:
                    self.buy_plunder_times()

                PlunderMatchCD(self.server_id, self.char_id, target_id).set(
                    GlobalConfig.value("PLUNDER_MATCH_CD"))

            else:
                if not self.get_revenge_remained_times():
                    raise GameException(
                        ConfigErrorMessage.get_error_id(
                            "PLUNDER_REVENGE_NO_TIMES"))

                self.send_revenge_notify()

        if updater:
            MongoPlunder.db(self.server_id).update_one({'_id': self.char_id},
                                                       {'$set': updater})

        if win is not None:
            self.plunder_report(way, win)
            return None

        my_way = self.get_way_object(way)
        if formation_slots:
            my_way.sync_slots(formation_slots)
            my_way.load_formation_staffs()
            self.send_formation_notify()

        my_club = Club(self.server_id, self.char_id, load_staffs=False)
        my_club.formation_staffs = my_way.formation_staffs

        match = ClubMatch(my_club, None, 3, my_way.get_skill_sequence(), {})
        msg = match.start(auto_load_staffs=False)
        msg.key = str(way)
        msg.map_name = GlobalConfig.value_string("MATCH_MAP_PLUNDER")

        return msg
예제 #40
0
파일: arena.py 프로젝트: zhifuliu/dianjing
    def report(self, key, win):
        rival_id = key

        my_rank = self.get_current_rank()
        my_max_rank = self.get_max_rank()

        doc = MongoArena.db(self.server_id).find_one(
            {'_id': str(self.char_id)}, {
                'search_index': 1,
                'continue_win': 1,
            })

        ArenaRefreshCD(self.server_id, self.char_id).clean()
        ArenaMatchCD(self.server_id, self.char_id,
                     rival_id).set(GlobalConfig.value("ARENA_MATCH_CD"))

        config_search = ConfigArenaSearchRange.get(doc['search_index'])
        if win:
            score_changed = config_search.score_win
            new_search_index = doc['search_index'] + 1
            continue_win = doc.get('continue_win', 0) + 1
        else:
            score_changed = -config_search.score_lose
            new_search_index = doc['search_index'] - 1
            continue_win = 0

        if new_search_index > ConfigArenaSearchRange.MAX_INDEX:
            new_search_index = ConfigArenaSearchRange.MAX_INDEX
        if new_search_index < 0:
            new_search_index = 0

        MongoArena.db(self.server_id).update_one({'_id': str(self.char_id)}, {
            '$set': {
                'search_index': new_search_index,
                'rival': 0,
                'continue_win': continue_win,
            },
            '$inc': {
                'match_times': 1,
            }
        })

        ass = ArenaScore(self.server_id, self.char_id)
        score_changed = ass.add_score(score_changed)

        new_rank = ass.rank
        max_rank_changed = False

        if new_rank > my_max_rank:
            my_max_rank = new_rank

            MongoArena.db(self.server_id).update_one(
                {'_id': str(self.char_id)}, {'$set': {
                    'max_rank': new_rank
                }})

            max_rank_changed = True

        rank_changed = new_rank - my_rank

        rival_rank = Arena(self.server_id, rival_id).get_current_rank()

        if win:
            ValueLogArenaWinTimes(self.server_id, self.char_id).record()
            config_reward = ConfigArenaMatchReward.get(1)
        else:
            config_reward = ConfigArenaMatchReward.get(2)

        ValueLogArenaHonorPoints(
            self.server_id, self.char_id).record(value=config_reward.honor)
        ValueLogArenaMatchTimes(self.server_id, self.char_id).record()

        drop = config_reward.get_drop()
        resource_classified = ResourceClassification.classify(drop)
        resource_classified.add(self.server_id,
                                self.char_id,
                                message="Arena.report:{0}".format(win))

        self.send_honor_notify()
        self.send_notify()

        arena_match_signal.send(
            sender=None,
            server_id=self.server_id,
            char_id=self.char_id,
            target_id=rival_id,
            target_name=ArenaClub(self.server_id, rival_id).name,
            my_rank=new_rank,
            target_rank=rival_rank,
            win=win,
            continue_win=continue_win,
        )

        if max_rank_changed:
            task_condition_trig_signal.send(sender=None,
                                            server_id=self.server_id,
                                            char_id=self.char_id,
                                            condition_name='core.arena.Arena')

        WinningArena(self.server_id, self.char_id).set(win)

        return resource_classified, score_changed, -rank_changed, my_max_rank, new_rank, ass.score
예제 #41
0
APPLY_WEEKDAY = [
    # 0,  # 星期一
    1,  # 星期二
    # 2,  # 星期三
    3,  # 星期四
    # 4,  # 星期五
    5,  # 星期六
    # 6,  # 星期日
]

# 允许报名时间范围 hour, minute
APPLY_TIME_RANGE = [(8, 0), (13, 30)]

MATCH_SERVER_REQ_HEADERS = {'NMVC_APIRequest': 'StartCombat'}

AUTO_APPLY_VIP_LEVEL = GlobalConfig.value("CHAMPIONSHIP_AUTO_APPLY_VIP_LEVEL")
APPLY_CLUB_LEVEL_LIMIT = GlobalConfig.value("CHAMPIONSHIP_APPLY_LEVEL_LIMIT")


def find_level_match_at(lv):
    today = get_start_time_of_today()
    weekday = today.weekday()

    days_shift = 0
    while True:
        if weekday in APPLY_WEEKDAY:
            break

        weekday -= 1
        if weekday < 0:
            weekday = 6