Example #1
0
    def destroy(self, staff_id, tp):
        from core.club import Club
        from core.formation import Formation

        self._destroy_check(staff_id)

        staff = self.get_staff_object(staff_id)
        if not staff:
            raise GameException(
                ConfigErrorMessage.get_error_id("STAFF_NOT_EXIST"))

        if tp == 0:
            # 普通分解
            items = staff.get_cost_items(70)
            crystal = ConfigStaffNew.get(staff.oid).crystal
            items.append((money_text_to_item_id('crystal'), crystal))
        else:
            if staff.is_initial_state():
                raise GameException(
                    ConfigErrorMessage.get_error_id(
                        "STAFF_CANNOT_DESTROY_INITIAL_STATE"))

            # TODO diamond count
            resource_classified = ResourceClassification.classify([
                (money_text_to_item_id('diamond'), 50)
            ])
            resource_classified.check_exist(self.server_id, self.char_id)
            resource_classified.remove(
                self.server_id,
                self.char_id,
                message="StaffManger.destroy:{0},{1}".format(staff.oid, tp))

            items = staff.get_cost_items(100)

        resource_classified = ResourceClassification.classify(items)
        resource_classified.add(self.server_id,
                                self.char_id,
                                message="StaffManger.destroy:{0},{1}".format(
                                    staff.oid, tp))

        if tp == 0:
            self.remove(staff_id)
        else:
            staff.reset()
            in_formation_staff_ids = Formation(
                self.server_id, self.char_id).in_formation_staffs().keys()
            if staff.id in in_formation_staff_ids:
                Club(self.server_id, self.char_id,
                     load_staffs=False).force_load_staffs(send_notify=True)
            else:
                staff.calculate()
                staff.make_cache()
                self.send_notify(ids=[staff_id])

        self.after_staffs_change_for_trig_signal()
        return resource_classified
Example #2
0
    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
Example #3
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()
Example #4
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()
Example #5
0
    def daily_buy(self):
        config = ConfigActivityDailyBuy.get(self.create_day)
        if not config:
            raise GameException(
                ConfigErrorMessage.get_error_id("INVALID_OPERATE"))

        if self.create_day in self.doc['daily_buy']:
            raise GameException(
                ConfigErrorMessage.get_error_id(
                    "ACTIVITY_DAILY_BUY_HAS_BOUGHT"))

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

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

        rc = ResourceClassification.classify(config.items)
        rc.add(self.server_id,
               self.char_id,
               message="ActivityNewPlayer.daily_buy")

        self.doc['daily_buy'].append(self.create_day)
        MongoActivityNewPlayer.db(self.server_id).update_one(
            {'_id': self.char_id}, {'$push': {
                'daily_buy': self.create_day
            }})

        self.send_daily_buy_notify()
        return rc
Example #6
0
    def create(self, party_level):
        ret = api_handle.API.Party.CreateDone()
        ret.ret = 0

        config = ConfigPartyLevel.get(party_level)
        if not config:
            ret.ret = ConfigErrorMessage.get_error_id("INVALID_OPERATE")
            return ret

        union = Union(self.server_id, self.char_id)
        union_id = union.get_joined_union_id()
        if not union_id:
            ret.ret = ConfigErrorMessage.get_error_id(
                "PARTY_CANNOT_CREATE_NO_UNION")

        try:
            union.check_level(config.need_union_level)
            cost = [
                (money_text_to_item_id('diamond'), config.need_diamond),
            ]
            rc = ResourceClassification.classify(cost)
            rc.check_exist(self.server_id, self.char_id)
        except GameException as e:
            ret.ret = e.error_id
            return ret

        ret.union_id = union_id
        return ret
Example #7
0
    def send_reward(self, goods_id):
        if goods_id == YUEKA_ID:
            # 月卡买了就立即发送
            # 后面的再定时发送
            config = ConfigPurchaseYueka.get(YUEKA_ID)
            got = 0
            actual_got = 0

            MongoPurchase.db(self.server_id).update_one(
                {'_id': self.char_id},
                {'$set': {
                    'yueka_remained_days': 29,
                    'yueka_new': True
                }}
            )

            self.doc['yueka_remained_days'] = 29
            self.doc['yueka_new'] = True

            rc = ResourceClassification.classify(config.rewards)
            attachment = rc.to_json()

            m = MailManager(self.server_id, self.char_id)
            m.add(config.mail_title, config.mail_content, attachment=attachment)
        else:
            config = ConfigPurchaseGoods.get(goods_id)

            got = config.diamond
            actual_got = config.diamond + config.diamond_extra
            if self.get_purchase_times() == 0:
                # 首充
                actual_got = config.diamond * 2 + config.diamond_extra

        doc = MongoPurchaseLog.document()
        doc['_id'] = make_string_id()
        doc['char_id'] = self.char_id
        doc['goods_id'] = goods_id
        doc['got'] = got
        doc['actual_got'] = actual_got
        doc['timestamp'] = arrow.utcnow().timestamp
        MongoPurchaseLog.db(self.server_id).insert_one(doc)

        reward = [
            (VIP_EXP_ITEM_ID, config.vip_exp),
            (money_text_to_item_id('diamond'), actual_got)
        ]

        rc = ResourceClassification.classify(reward)
        rc.add(self.server_id, self.char_id, message="Purchase.send_reward:{0}".format(goods_id))

        purchase_done_signal.send(
            sender=None,
            server_id=self.server_id,
            char_id=self.char_id,
            goods_id=goods_id,
            got=got,
            actual_got=actual_got,
        )

        self.send_notify()
Example #8
0
    def buy_reward(self, vip_level):
        self.check(vip_level)
        config = ConfigVIP.get(vip_level)
        if not config:
            raise GameException(
                ConfigErrorMessage.get_error_id("INVALID_OPERATE"))

        if vip_level in self.doc['rewards']:
            raise GameException(
                ConfigErrorMessage.get_error_id("VIP_ALREADY_BUY_REWARD"))

        needs = [(money_text_to_item_id('diamond'), config.diamond_now)]
        rc = ResourceClassification.classify(needs)
        rc.check_exist(self.server_id, self.char_id)
        rc.remove(self.server_id,
                  self.char_id,
                  message="VIP.buy_reward:{0}".format(vip_level))

        got = [(config.item_id, 1)]
        rc = ResourceClassification.classify(got)
        rc.add(self.server_id,
               self.char_id,
               message="VIP.buy_reward:{0}".format(vip_level))

        self.doc['rewards'].append(vip_level)
        MongoVIP.db(self.server_id).update_one(
            {'_id': self.char_id}, {'$set': {
                'rewards': self.doc['rewards']
            }})

        self.send_notify()
        return rc
Example #9
0
    def buy_reward(self, vip_level):
        self.check(vip_level)
        config = ConfigVIP.get(vip_level)
        if not config:
            raise GameException(ConfigErrorMessage.get_error_id("INVALID_OPERATE"))

        if vip_level in self.doc['rewards']:
            raise GameException(ConfigErrorMessage.get_error_id("VIP_ALREADY_BUY_REWARD"))

        needs = [(money_text_to_item_id('diamond'), config.diamond_now)]
        rc = ResourceClassification.classify(needs)
        rc.check_exist(self.server_id, self.char_id)
        rc.remove(self.server_id, self.char_id, message="VIP.buy_reward:{0}".format(vip_level))

        got = [(config.item_id, 1)]
        rc = ResourceClassification.classify(got)
        rc.add(self.server_id, self.char_id, message="VIP.buy_reward:{0}".format(vip_level))

        self.doc['rewards'].append(vip_level)
        MongoVIP.db(self.server_id).update_one(
            {'_id': self.char_id},
            {'$set': {
                'rewards': self.doc['rewards']
            }}
        )

        self.send_notify()
        return rc
Example #10
0
    def create(self, party_level):
        ret = api_handle.API.Party.CreateDone()
        ret.ret = 0

        config = ConfigPartyLevel.get(party_level)
        if not config:
            ret.ret = ConfigErrorMessage.get_error_id("INVALID_OPERATE")
            return ret

        union = Union(self.server_id, self.char_id)
        union_id = union.get_joined_union_id()
        if not union_id:
            ret.ret = ConfigErrorMessage.get_error_id("PARTY_CANNOT_CREATE_NO_UNION")

        try:
            union.check_level(config.need_union_level)
            cost = [(money_text_to_item_id('diamond'), config.need_diamond), ]
            rc = ResourceClassification.classify(cost)
            rc.check_exist(self.server_id, self.char_id)
        except GameException as e:
            ret.ret = e.error_id
            return ret

        ret.union_id = union_id
        return ret
Example #11
0
    def buy_plunder_times(self):
        info = PlunderTimesBuyInfo(self.server_id, self.char_id)
        if not info.remained_buy_times:
            raise GameException(
                ConfigErrorMessage.get_error_id("PLUNDER_NO_BUY_TIMES"))

        cost = [
            (money_text_to_item_id('diamond'), info.buy_cost),
        ]

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

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

        self.doc['plunder_remained_times'] += 1
        MongoPlunder.db(self.server_id).update_one({'_id': self.char_id}, {
            '$set': {
                'plunder_remained_times': self.doc['plunder_remained_times']
            }
        })
        self.send_plunder_times_notify()
Example #12
0
    def make_inspire(self):
        """

        :rtype: ResourceClassification | None
        """
        if not self.remained_inspire_times():
            raise GameException(
                ConfigErrorMessage.get_error_id("TERRITORY_NO_INSPIRE_TIMES"))

        cost = [
            (money_text_to_item_id('diamond'), self.inspire_cost()),
        ]
        rc = ResourceClassification.classify(cost)
        rc.check_exist(self.server_id, self.char_id)
        rc.remove(self.server_id,
                  self.char_id,
                  message="Building.make_inspire")

        ValueLogTerritoryBuildingInspireTimes(
            self.server_id, self.char_id).record(sub_id=self.id)

        config = ConfigTerritoryBuilding.get(
            self.id).levels[self.level].inspire

        level_up = self.add_exp(config.exp)
        reward = config.get_reward()
        if reward:
            rc = ResourceClassification.classify(reward)
            rc.add(self.server_id,
                   self.char_id,
                   message="Building.make_inspire")
            return rc, level_up

        return None, level_up
Example #13
0
    def start(self, party_level, member_ids):
        # member_ids 只是组员, 不包括创建者自己
        ret = api_handle.API.Party.StartDone()
        ret.ret = 0

        config = ConfigPartyLevel.get(party_level)
        try:
            cost = [
                (money_text_to_item_id('diamond'), config.need_diamond),
            ]
            rc = ResourceClassification.classify(cost)
            rc.check_exist(self.server_id, self.char_id)
            rc.remove(self.server_id,
                      self.char_id,
                      message="Party.start:{0}".format(party_level))
        except GameException as e:
            ret.ret = e.error_id
            return ret

        ValueLogPartyCreateTimes(self.server_id, self.char_id).record()
        ValueLogPartyEngageTimes(self.server_id, self.char_id).record()
        for mid in member_ids:
            ValueLogPartyJoinTimes(self.server_id, mid).record()
            ValueLogPartyEngageTimes(self.server_id, self.char_id).record()

        return ret
Example #14
0
    def refresh(self):
        cd = self.get_refresh_cd()
        if cd:
            # 就是要花钱了
            ti = TimesInfo(self.server_id, self.char_id)
            if not ti.remained_reset_times:
                raise GameException(ConfigErrorMessage.get_error_id("ARENA_NO_SEARCH_RESET_TIMES"))

            cost = [(money_text_to_item_id('diamond'), ti.reset_cost), ]
            rc = ResourceClassification.classify(cost)
            rc.check_exist(self.server_id, self.char_id)
            rc.remove(self.server_id, self.char_id, message="Arena.refresh")

            ValueLogArenaSearchResetTimes(self.server_id, self.char_id).record()
        else:
            ArenaRefreshCD(self.server_id, self.char_id).set(ARENA_REFRESH_CD_SECONDS)

        rival = self.search_rival()

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

        self.send_notify()
Example #15
0
    def equipment_batch_destroy(self, slot_ids):
        total_items = {}

        for slot_id in slot_ids:
            self._equipment_destroy_check(slot_id)
            this_slot = self.doc['slots'][slot_id]
            item_id = this_slot['item_id']

            config = ConfigEquipmentNew.get(item_id)
            equip = Equipment.load_from_slot_data(this_slot)

            items = equip.get_destroy_back_items(is_normal_destroy=True)
            if config.renown:
                items.append((money_text_to_item_id('renown'), config.renown))

            for _id, _amount in items:
                if _id in total_items:
                    total_items[_id] += _amount
                else:
                    total_items[_id] = _amount

        rc = ResourceClassification.classify(total_items.items())
        rc.add(self.server_id, self.char_id, message="Bag.equipment_batch_destroy")

        for slot_id in slot_ids:
            self.remove_by_slot_id(slot_id, 1)

        return rc
Example #16
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
Example #17
0
    def batch_destroy(self, staff_ids):
        total_items = {}

        for sid in staff_ids:
            self._destroy_check(sid)

            staff = self.get_staff_object(sid)
            if not staff:
                raise GameException(
                    ConfigErrorMessage.get_error_id("STAFF_NOT_EXIST"))

            _items = staff.get_cost_items(70)
            _crystal = ConfigStaffNew.get(staff.oid).crystal
            _items.append((money_text_to_item_id('crystal'), _crystal))

            for _id, _amount in _items:
                if _id in total_items:
                    total_items[_id] += _amount
                else:
                    total_items[_id] = _amount

        rc = ResourceClassification.classify(total_items.items())
        rc.add(self.server_id,
               self.char_id,
               message="StaffManger.batch_destroy")

        self.remove(staff_ids)
        self.after_staffs_change_for_trig_signal()
        return rc
Example #18
0
    def make_inspire(self):
        """

        :rtype: ResourceClassification | None
        """
        if not self.remained_inspire_times():
            raise GameException(ConfigErrorMessage.get_error_id("TERRITORY_NO_INSPIRE_TIMES"))

        cost = [(money_text_to_item_id('diamond'), self.inspire_cost()), ]
        rc = ResourceClassification.classify(cost)
        rc.check_exist(self.server_id, self.char_id)
        rc.remove(self.server_id, self.char_id, message="Building.make_inspire")

        ValueLogTerritoryBuildingInspireTimes(self.server_id, self.char_id).record(sub_id=self.id)

        config = ConfigTerritoryBuilding.get(self.id).levels[self.level].inspire

        level_up = self.add_exp(config.exp)
        reward = config.get_reward()
        if reward:
            rc = ResourceClassification.classify(reward)
            rc.add(self.server_id, self.char_id, message="Building.make_inspire")
            return rc, level_up

        return None, level_up
Example #19
0
    def batch_destroy(self, staff_ids):
        total_items = {}

        for sid in staff_ids:
            self._destroy_check(sid)

            staff = self.get_staff_object(sid)
            if not staff:
                raise GameException(ConfigErrorMessage.get_error_id("STAFF_NOT_EXIST"))

            _items = staff.get_cost_items(70)
            _crystal = ConfigStaffNew.get(staff.oid).crystal
            _items.append((money_text_to_item_id('crystal'), _crystal))

            for _id, _amount in _items:
                if _id in total_items:
                    total_items[_id] += _amount
                else:
                    total_items[_id] = _amount

        rc = ResourceClassification.classify(total_items.items())
        rc.add(self.server_id, self.char_id, message="StaffManger.batch_destroy")

        self.remove(staff_ids)
        self.after_staffs_change_for_trig_signal()
        return rc
Example #20
0
    def daily_buy(self):
        config = ConfigActivityDailyBuy.get(self.create_day)
        if not config:
            raise GameException(ConfigErrorMessage.get_error_id("INVALID_OPERATE"))

        if self.create_day in self.doc['daily_buy']:
            raise GameException(ConfigErrorMessage.get_error_id("ACTIVITY_DAILY_BUY_HAS_BOUGHT"))

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

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

        rc = ResourceClassification.classify(config.items)
        rc.add(self.server_id, self.char_id, message="ActivityNewPlayer.daily_buy")

        self.doc['daily_buy'].append(self.create_day)
        MongoActivityNewPlayer.db(self.server_id).update_one(
            {'_id': self.char_id},
            {'$push': {
                'daily_buy': self.create_day
            }}
        )

        self.send_daily_buy_notify()
        return rc
Example #21
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()
Example #22
0
    def reset(self):
        if not self.doc['cost_point']:
            raise GameException(
                ConfigErrorMessage.get_error_id(
                    "TALENT_CANNOT_RESET_NOT_USE_POINT"))

        using_items = [(money_text_to_item_id('diamond'),
                        RESET_TALENT_TREE_COST)]
        resource_classified = ResourceClassification.classify(using_items)
        resource_classified.check_exist(self.server_id, self.char_id)
        resource_classified.remove(self.server_id,
                                   self.char_id,
                                   message="TalentManager.reset")

        self.doc['talents'] = ConfigTalent.INIT_TALENT_IDS
        self.doc['cost_point'] = 0

        MongoTalent.db(self.server_id).update_one({'_id': self.char_id}, {
            '$set': {
                'talents': self.doc['talents'],
                'cost_point': self.doc['cost_point'],
            }
        })

        self.send_notify()
        self.after_change()
Example #23
0
    def refresh(self):
        cd = self.get_refresh_cd()
        if cd:
            # 就是要花钱了
            ti = TimesInfo(self.server_id, self.char_id)
            if not ti.remained_reset_times:
                raise GameException(
                    ConfigErrorMessage.get_error_id(
                        "ARENA_NO_SEARCH_RESET_TIMES"))

            cost = [
                (money_text_to_item_id('diamond'), ti.reset_cost),
            ]
            rc = ResourceClassification.classify(cost)
            rc.check_exist(self.server_id, self.char_id)
            rc.remove(self.server_id, self.char_id, message="Arena.refresh")

            ValueLogArenaSearchResetTimes(self.server_id,
                                          self.char_id).record()
        else:
            ArenaRefreshCD(self.server_id,
                           self.char_id).set(ARENA_REFRESH_CD_SECONDS)

        rival = self.search_rival()

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

        self.send_notify()
Example #24
0
        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")
Example #25
0
    def destroy(self, staff_id, tp):
        from core.club import Club
        from core.formation import Formation

        self._destroy_check(staff_id)

        staff = self.get_staff_object(staff_id)
        if not staff:
            raise GameException(ConfigErrorMessage.get_error_id("STAFF_NOT_EXIST"))

        if tp == 0:
            # 普通分解
            items = staff.get_cost_items(70)
            crystal = ConfigStaffNew.get(staff.oid).crystal
            items.append((money_text_to_item_id('crystal'), crystal))
        else:
            if staff.is_initial_state():
                raise GameException(ConfigErrorMessage.get_error_id("STAFF_CANNOT_DESTROY_INITIAL_STATE"))

            # TODO diamond count
            resource_classified = ResourceClassification.classify([(money_text_to_item_id('diamond'), 50)])
            resource_classified.check_exist(self.server_id, self.char_id)
            resource_classified.remove(self.server_id, self.char_id,
                                       message="StaffManger.destroy:{0},{1}".format(staff.oid, tp))

            items = staff.get_cost_items(100)

        resource_classified = ResourceClassification.classify(items)
        resource_classified.add(self.server_id, self.char_id,
                                message="StaffManger.destroy:{0},{1}".format(staff.oid, tp))

        if tp == 0:
            self.remove(staff_id)
        else:
            staff.reset()
            in_formation_staff_ids = Formation(self.server_id, self.char_id).in_formation_staffs().keys()
            if staff.id in in_formation_staff_ids:
                Club(self.server_id, self.char_id, load_staffs=False).force_load_staffs(send_notify=True)
            else:
                staff.calculate()
                staff.make_cache()
                self.send_notify(ids=[staff_id])

        self.after_staffs_change_for_trig_signal()
        return resource_classified
Example #26
0
    def item_destroy(self, slot_id):
        # 碎片销毁
        item_id = self.doc['slots'][slot_id]['item_id']
        amount = self.doc['slots'][slot_id]['amount']

        tp = get_item_type(item_id)
        assert tp == TYPE_FRAGMENT
        self.remove_by_slot_id(slot_id, amount)

        config = ConfigItemMerge.get(item_id)
        drop = []
        if config.renown:
            drop.append((money_text_to_item_id('renown'), config.renown * amount))
        if config.crystal:
            drop.append((money_text_to_item_id('crystal'), config.crystal * amount))

        resource_classified = ResourceClassification.classify(drop)
        resource_classified.add(self.server_id, self.char_id, message="Bag.item_destroy:{0}".format(item_id))
        return resource_classified
Example #27
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 #28
0
    def buy_times(self):
        ti = TimesInfo(self.server_id, self.char_id)
        if not ti.remained_buy_times:
            raise GameException(ConfigErrorMessage.get_error_id("ARENA_NO_BUY_TIMES"))

        cost = [(money_text_to_item_id('diamond'), ti.buy_cost), ]
        rc = ResourceClassification.classify(cost)
        rc.check_exist(self.server_id, self.char_id)
        rc.remove(self.server_id, self.char_id, message="Arena.buy_times")

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

        self.send_notify()
Example #29
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 #30
0
    def buy_times(self):
        if not self.remained_buy_times:
            raise GameException(ConfigErrorMessage.get_error_id("UNION_HARASS_NO_BUY_TIMES"))

        cost = [(money_text_to_item_id('diamond'), self.buy_cost)]
        rc = ResourceClassification.classify(cost)
        rc.check_exist(self.server_id, self.char_id)
        rc.remove(self.server_id, self.char_id, message="HarassInfo.buy_times")

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

        self.current_buy_times += 1
        self._calculate()
Example #31
0
    def buy_times(self, category_id, send_notify=True):
        ri = TimesInfo(self.server_id, self.char_id, category_id)
        if not ri.remained_buy_times:
            raise GameException(ConfigErrorMessage.get_error_id("DUNGEON_NO_BUY_TIMES"))

        cost = [(money_text_to_item_id('diamond'), ri.buy_cost), ]
        rc = ResourceClassification.classify(cost)
        rc.check_exist(self.server_id, self.char_id)
        rc.remove(self.server_id, self.char_id, message="Dungeon.buy_times:{0}".format(category_id))

        ValueLogDungeonBuyTimes(self.server_id, self.char_id).record(sub_id=category_id)

        if send_notify:
            self.send_notify(category_id=category_id)
Example #32
0
    def buy_times(self):
        if not self.remained_buy_times:
            raise GameException(
                ConfigErrorMessage.get_error_id("UNION_HARASS_NO_BUY_TIMES"))

        cost = [(money_text_to_item_id('diamond'), self.buy_cost)]
        rc = ResourceClassification.classify(cost)
        rc.check_exist(self.server_id, self.char_id)
        rc.remove(self.server_id, self.char_id, message="HarassInfo.buy_times")

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

        self.current_buy_times += 1
        self._calculate()
Example #33
0
    def refresh(self, tp):
        if tp not in ALL_TYPES:
            raise GameException(ConfigErrorMessage.get_error_id("INVALID_OPERATE"))

        ri = RefreshInfo(self.server_id, self.char_id, tp)
        if not ri.remained_refresh_times:
            raise GameException(ConfigErrorMessage.get_error_id("STORE_REFRESH_NO_TIMES"))

        cost = [(money_text_to_item_id('diamond'), ri.refresh_cost), ]
        resource_classified = ResourceClassification.classify(cost)
        resource_classified.check_exist(self.server_id, self.char_id)
        resource_classified.remove(self.server_id, self.char_id, message="Store.refresh:{0}".format(tp))

        ValueLogStoreRefreshTimes(self.server_id, self.char_id).record(sub_id=tp)
        self.make_refresh(tp)
Example #34
0
    def buy_times(self):
        ti = TimesInfo(self.server_id, self.char_id)
        if not ti.remained_buy_times:
            raise GameException(
                ConfigErrorMessage.get_error_id("ARENA_NO_BUY_TIMES"))

        cost = [
            (money_text_to_item_id('diamond'), ti.buy_cost),
        ]
        rc = ResourceClassification.classify(cost)
        rc.check_exist(self.server_id, self.char_id)
        rc.remove(self.server_id, self.char_id, message="Arena.buy_times")

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

        self.send_notify()
Example #35
0
    def buy(self):
        # 购买体力
        ri = BuyTimeInfo(self.server_id, self.char_id)
        if not ri.remained_buy_times:
            raise GameException(ConfigErrorMessage.get_error_id("ENERGY_CANNOT_BUY_NO_TIMES"))

        if self.doc['current'] + 60 > MAX_ENERGY_HARD_LIMIT:
            raise GameException(ConfigErrorMessage.get_error_id("ENERGY_CANNOT_BUY_REACH_HARD_LIMIT"))

        cost = [(money_text_to_item_id('diamond'), ri.buy_cost), ]
        rc = ResourceClassification.classify(cost)
        rc.check_exist(self.server_id, self.char_id)
        rc.remove(self.server_id, self.char_id, message="Energy.buy")

        ValueLogEnergyBuyTimes(self.server_id, self.char_id).record()
        self.add(60)
Example #36
0
    def buy_goods(self, goods_index):
        goods = self.doc.get('goods', [])
        try:
            goods_id, bought = goods[goods_index]
        except IndexError:
            raise GameException(ConfigErrorMessage.get_error_id("INVALID_OPERATE"))

        if bought:
            raise GameException(ConfigErrorMessage.get_error_id("TOWER_GOODS_HAS_BOUGHT"))

        config = ConfigTowerSaleGoods.get(goods_id)

        if config.vip_need:
            VIP(self.server_id, self.char_id).check(config.vip_need)

        cost = [(money_text_to_item_id('diamond'), config.price_now)]
        rc = ResourceClassification.classify(cost)
        rc.check_exist(self.server_id, self.char_id)
        rc.remove(self.server_id, self.char_id, message="Tower.buy_goods")

        got = [(config.item_id, config.amount)]
        rc = ResourceClassification.classify(got)
        rc.add(self.server_id, self.char_id, message="Tower.buy_goods")

        self.doc['goods'][goods_index][1] = 1

        # NOTE 这里要把买完的那一组删掉
        if goods_index % 2 == 0:
            # 0, 2, 4 的情况,这组下一个的index是 goods_index+1
            other_index = goods_index + 1
        else:
            other_index = goods_index - 1

        if self.doc['goods'][other_index][1] == 1:
            _index = min(other_index, goods_index)
            self.doc['goods'].pop(_index)
            self.doc['goods'].pop(_index)

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

        self.send_goods_notify()
        return rc
Example #37
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()
Example #38
0
    def spy(self, target_id):
        index = self.find_search_target_index_by_target_id(target_id)
        if self.doc['search'][index]['spied']:
            return

        cost = [(money_text_to_item_id('diamond'), 5), ]

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

        self.doc['search'][index]['spied'] = True
        MongoPlunder.db(self.server_id).update_one(
            {'_id': self.char_id},
            {'$set': {
                'search.{0}.spied'.format(index): True
            }}
        )

        self.send_search_notify()
Example #39
0
    def buy_times(self, category_id, send_notify=True):
        ri = TimesInfo(self.server_id, self.char_id, category_id)
        if not ri.remained_buy_times:
            raise GameException(
                ConfigErrorMessage.get_error_id("DUNGEON_NO_BUY_TIMES"))

        cost = [
            (money_text_to_item_id('diamond'), ri.buy_cost),
        ]
        rc = ResourceClassification.classify(cost)
        rc.check_exist(self.server_id, self.char_id)
        rc.remove(self.server_id,
                  self.char_id,
                  message="Dungeon.buy_times:{0}".format(category_id))

        ValueLogDungeonBuyTimes(self.server_id,
                                self.char_id).record(sub_id=category_id)

        if send_notify:
            self.send_notify(category_id=category_id)
Example #40
0
    def reset(self, challenge_id):
        config = ConfigChallengeMatch.get(challenge_id)
        if not config:
            raise GameException(ConfigErrorMessage.get_error_id("CHALLENGE_NOT_EXIST"))

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

        if not rt.remained_reset_times:
            raise GameException(ConfigErrorMessage.get_error_id("CHALLENGE_NO_RESET_TIMES"))

        cost = [(money_text_to_item_id('diamond'), rt.reset_cost), ]
        rc = ResourceClassification.classify(cost)
        rc.check_exist(self.server_id, self.char_id)
        rc.remove(self.server_id, self.char_id, message="Challenge.reset:{0}".format(challenge_id))

        ValueLogChallengeResetTimes(self.server_id, self.char_id).record(sub_id=challenge_id)

        self.send_challenge_notify(ids=[challenge_id])
Example #41
0
    def buy(self):
        # 购买体力
        ri = BuyTimeInfo(self.server_id, self.char_id)
        if not ri.remained_buy_times:
            raise GameException(
                ConfigErrorMessage.get_error_id("ENERGY_CANNOT_BUY_NO_TIMES"))

        if self.doc['current'] + 60 > MAX_ENERGY_HARD_LIMIT:
            raise GameException(
                ConfigErrorMessage.get_error_id(
                    "ENERGY_CANNOT_BUY_REACH_HARD_LIMIT"))

        cost = [
            (money_text_to_item_id('diamond'), ri.buy_cost),
        ]
        rc = ResourceClassification.classify(cost)
        rc.check_exist(self.server_id, self.char_id)
        rc.remove(self.server_id, self.char_id, message="Energy.buy")

        ValueLogEnergyBuyTimes(self.server_id, self.char_id).record()
        self.add(60)
Example #42
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()
Example #43
0
    def spy(self, target_id):
        index = self.find_search_target_index_by_target_id(target_id)
        if self.doc['search'][index]['spied']:
            return

        cost = [
            (money_text_to_item_id('diamond'), 5),
        ]

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

        self.doc['search'][index]['spied'] = True
        MongoPlunder.db(self.server_id).update_one(
            {'_id': self.char_id},
            {'$set': {
                'search.{0}.spied'.format(index): True
            }})

        self.send_search_notify()
Example #44
0
    def buy_plunder_times(self):
        info = PlunderTimesBuyInfo(self.server_id, self.char_id)
        if not info.remained_buy_times:
            raise GameException(ConfigErrorMessage.get_error_id("PLUNDER_NO_BUY_TIMES"))

        cost = [(money_text_to_item_id('diamond'), info.buy_cost), ]

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

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

        self.doc['plunder_remained_times'] += 1
        MongoPlunder.db(self.server_id).update_one(
            {'_id': self.char_id},
            {'$set': {
                'plunder_remained_times': self.doc['plunder_remained_times']
            }}
        )
        self.send_plunder_times_notify()
Example #45
0
    def reset(self):
        sweep_end_at = self.doc.get('sweep_end_at', 0)
        if sweep_end_at:
            raise GameException(ConfigErrorMessage.get_error_id("TOWER_IN_SWEEP_CANNOT_OPERATE"))

        ri = ResetInfo(self.server_id, self.char_id)
        if not ri.remained_times:
            raise GameException(ConfigErrorMessage.get_error_id("TOWER_NO_RESET_TIMES"))

        if -1 not in self.doc['levels'].values():
            # 没有失败的, 看看是不是全部完成了
            if not self.is_all_complete():
                raise GameException(ConfigErrorMessage.get_error_id("TOWER_CANNOT_RESET_NO_FAILURE"))

        if ri.reset_cost:
            cost = [(money_text_to_item_id('diamond'), ri.reset_cost)]
            resource_classified = ResourceClassification.classify(cost)
            resource_classified.check_exist(self.server_id, self.char_id)
            resource_classified.remove(self.server_id, self.char_id, message="Tower.reset")

        self.doc['levels'] = {'1': 0}
        self.doc['talents'] = []
        self.doc['current_star'] = 0
        self.doc['turntable'] = {}
        self.doc['goods'] = []

        MongoTower.db(self.server_id).update_one(
            {'_id': self.char_id},
            {'$set': {
                'levels': self.doc['levels'],
                'talents': self.doc['talents'],
                'current_star': self.doc['current_star'],
                'turntable': {},
                'goods': [],
            }}
        )

        ValueLogTowerResetTimes(self.server_id, self.char_id).record()
        self.send_notify()
        self.send_goods_notify()
Example #46
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 #47
0
    def start(self, party_level, member_ids):
        # member_ids 只是组员, 不包括创建者自己
        ret = api_handle.API.Party.StartDone()
        ret.ret = 0

        config = ConfigPartyLevel.get(party_level)
        try:
            cost = [(money_text_to_item_id('diamond'), config.need_diamond), ]
            rc = ResourceClassification.classify(cost)
            rc.check_exist(self.server_id, self.char_id)
            rc.remove(self.server_id, self.char_id, message="Party.start:{0}".format(party_level))
        except GameException as e:
            ret.ret = e.error_id
            return ret

        ValueLogPartyCreateTimes(self.server_id, self.char_id).record()
        ValueLogPartyEngageTimes(self.server_id, self.char_id).record()
        for mid in member_ids:
            ValueLogPartyJoinTimes(self.server_id, mid).record()
            ValueLogPartyEngageTimes(self.server_id, self.char_id).record()

        return ret
Example #48
0
    def reset(self):
        if not self.doc['cost_point']:
            raise GameException(ConfigErrorMessage.get_error_id("TALENT_CANNOT_RESET_NOT_USE_POINT"))

        using_items = [(money_text_to_item_id('diamond'), RESET_TALENT_TREE_COST)]
        resource_classified = ResourceClassification.classify(using_items)
        resource_classified.check_exist(self.server_id, self.char_id)
        resource_classified.remove(self.server_id, self.char_id, message="TalentManager.reset")

        self.doc['talents'] = ConfigTalent.INIT_TALENT_IDS
        self.doc['cost_point'] = 0

        MongoTalent.db(self.server_id).update_one(
            {'_id': self.char_id},
            {'$set': {
                'talents': self.doc['talents'],
                'cost_point': self.doc['cost_point'],
            }}
        )

        self.send_notify()
        self.after_change()
Example #49
0
    def refresh(self, tp):
        if tp not in ALL_TYPES:
            raise GameException(
                ConfigErrorMessage.get_error_id("INVALID_OPERATE"))

        ri = RefreshInfo(self.server_id, self.char_id, tp)
        if not ri.remained_refresh_times:
            raise GameException(
                ConfigErrorMessage.get_error_id("STORE_REFRESH_NO_TIMES"))

        cost = [
            (money_text_to_item_id('diamond'), ri.refresh_cost),
        ]
        resource_classified = ResourceClassification.classify(cost)
        resource_classified.check_exist(self.server_id, self.char_id)
        resource_classified.remove(self.server_id,
                                   self.char_id,
                                   message="Store.refresh:{0}".format(tp))

        ValueLogStoreRefreshTimes(self.server_id,
                                  self.char_id).record(sub_id=tp)
        self.make_refresh(tp)
Example #50
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
Example #51
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 #52
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()
Example #53
0
        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")
Example #54
0
    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
Example #55
0
    def send_reward(self, goods_id):
        if goods_id == YUEKA_ID:
            # 月卡买了就立即发送
            # 后面的再定时发送
            config = ConfigPurchaseYueka.get(YUEKA_ID)
            got = 0
            actual_got = 0

            MongoPurchase.db(self.server_id).update_one(
                {'_id': self.char_id},
                {'$set': {
                    'yueka_remained_days': 29,
                    'yueka_new': True
                }})

            self.doc['yueka_remained_days'] = 29
            self.doc['yueka_new'] = True

            rc = ResourceClassification.classify(config.rewards)
            attachment = rc.to_json()

            m = MailManager(self.server_id, self.char_id)
            m.add(config.mail_title,
                  config.mail_content,
                  attachment=attachment)
        else:
            config = ConfigPurchaseGoods.get(goods_id)

            got = config.diamond
            actual_got = config.diamond + config.diamond_extra
            if self.get_purchase_times() == 0:
                # 首充
                actual_got = config.diamond * 2 + config.diamond_extra

        doc = MongoPurchaseLog.document()
        doc['_id'] = make_string_id()
        doc['char_id'] = self.char_id
        doc['goods_id'] = goods_id
        doc['got'] = got
        doc['actual_got'] = actual_got
        doc['timestamp'] = arrow.utcnow().timestamp
        MongoPurchaseLog.db(self.server_id).insert_one(doc)

        reward = [(VIP_EXP_ITEM_ID, config.vip_exp),
                  (money_text_to_item_id('diamond'), actual_got)]

        rc = ResourceClassification.classify(reward)
        rc.add(self.server_id,
               self.char_id,
               message="Purchase.send_reward:{0}".format(goods_id))

        purchase_done_signal.send(
            sender=None,
            server_id=self.server_id,
            char_id=self.char_id,
            goods_id=goods_id,
            got=got,
            actual_got=actual_got,
        )

        self.send_notify()