Ejemplo n.º 1
0
    def _calc_drum_result(self, union_response, data, item, cost_gold, req,
                          timer):
        union_res = internal_union_pb2.InternalDrumForUnionBattleRes()
        union_res.ParseFromString(union_response)

        if union_res.status != 0:
            raise Exception("Query union battle res error")

        res = union_battle_pb2.QueryUnionBattleRes()
        res.status = 0
        res.ret = union_res.ret

        if union_res.ret == union_pb2.UNION_OK:
            score = union_res.individual_battle_score_add
            union_battle_business.drum(data, item, cost_gold, score, timer.now)
            if req.HasField("item"):
                compare.check_item(data, req.item)

        if union_res.HasField("battle"):
            defer = UnionBattlePatcher().patch(res.battle, union_res.battle,
                                               data, timer.now)
            defer.addCallback(self._calc_drum_post, data, req, res, timer)
            return defer

        return self._calc_drum_post(None, data, req, res, timer)
Ejemplo n.º 2
0
    def _calc_respond_result(self, union_response, data, req, timer):
        union_res = internal_union_pb2.InternalRespondUnionAidRes()
        union_res.ParseFromString(union_response)

        if union_res.status != 0:
            raise Exception("Query union aid res error")

        res = union_pb2.RespondUnionAidRes()
        res.status = 0
        res.ret = union_res.ret

        if res.ret != union_pb2.UNION_OK:
            return self._respond_succeed(data, req, res, timer)

        #结束联盟援助
        if not union_business.respond_aid(data, req.item.basic_id,
                                          union_res.honor, union_res.exp,
                                          union_res.gold, timer.now):
            raise Exception("Respond aid failed")

        pack.pack_resource_info(data.resource.get(), res.resource)
        res.union_prosperity = union_res.prosperity

        compare.check_item(data, req.item)
        compare.check_user(data, req.monarch, with_level=True)

        #发广播
        defer = self._respond_broadcast(data, req, timer)
        defer.addCallback(self._calc_respond_result_broadcast, data, req, res,
                          timer)
        return defer
Ejemplo n.º 3
0
    def _calc_use_speed_item(self, data, req, timer):
        res = speed_pb2.UseSpeedItemRes()
        res.status = 0

        building = None
        technology = None
        if req.HasField("building"):
            building_id = BuildingInfo.generate_id(data.id,
                                                   req.building.city_basic_id,
                                                   req.building.location_index,
                                                   req.building.basic_id)
            building = data.building_list.get(building_id)

        elif req.HasField("tech"):
            technology_id = TechnologyInfo.generate_id(data.id,
                                                       req.tech.basic_id,
                                                       req.tech.type)
            technology = data.technology_list.get(technology_id)

        item_id = ItemInfo.generate_id(data.id, req.item.basic_id)
        item = data.item_list.get(item_id)

        use_num = item.num - req.item.num
        if not item_business.use_speed_item(item, use_num, building,
                                            technology):
            logger.warning("Use speed item failed")
            res.return_ret = speed_pb2.UseSpeedItemRes.SPEED_ITEM_ERROR
        else:
            res.return_ret = 0

        compare.check_item(data, req.item)

        defer = DataBase().commit(data)
        defer.addCallback(self._use_speed_item_succeed, req, res, timer)
        return defer
Ejemplo n.º 4
0
    def _calc_choose_card(self, data, req, timer):
        """
        """
        #涉及到跨天的数据统计,所以此处要更新所有跨天数据
        if not account_business.update_across_day_info(data, timer.now):
            raise Exception("Update across day info failed")

        cost_gold = 0
        if req.HasField("cost_gold"):
            cost_gold = req.cost_gold

        if not pray_business.choose_card(data, req.choose_index, cost_gold):
            raise Exception("Choose card failed")

        for item in req.item:
            compare.check_item(data, item)

        pray = data.pray.get()
        #if cost_gold != 0:
        #   log = log_formater.output_gold(data, -cost_gold, log_formater.CHOOSE_CARD,
        #       "Choose card by gold", choose_index = (pray.get_choose_card_num() + 1))
        #   logger.notice(log)

        if pray.is_need_broadcast():
            #祈福最后一次是翻倍的奖励发广播
            try:
                self._add_pray_broadcast(data.user.get(), pray)
            except:
                logger.warning("Send pray broadcast failed")

        return DataBase().commit(data)
Ejemplo n.º 5
0
    def _calc_finish_mission(self, data, req, timer):
        if not mission_business.finish_mission(req.mission.basic_id, data,
                                               timer.now):
            raise Exception("mission not finished.")

        #验证
        if req.HasField("monarch"):
            compare.check_user(data, req.monarch, with_level=True)
        for item_info in req.items:
            compare.check_item(data, item_info)

        #删除当前任务
        mission_id = MissionInfo.generate_id(data.id, req.mission.basic_id)
        data.mission_list.delete(mission_id)

        mission_data = data_loader.AllMission_dict[req.mission.basic_id]
        mission_name = mission_business.MissionPool().get_mission_name(
            req.mission.basic_id)
        if mission_data.type == mission_business.MISSION_TYPE_DAILY and  \
            mission_name != mission_business.MISSION_VITALITY and \
            mission_name != mission_business.MISSION_VIP_LEVEL:
            #记录次数
            trainer = data.trainer.get()
            trainer.add_daily_vitality(1)
        if mission_data.type >= 11 and mission_data.type <= 17 and \
            mission_name != mission_business.DAY7_MISSION_VITALITY:
            trainer = data.trainer.get()
            trainer.add_day7_vitality(1)

        return DataBase().commit(data)
Ejemplo n.º 6
0
    def _calc_buy_legendcity_goods(self, data, req, timer):
        """购买史实城商店中的商品
        """
        shop_id = ShopInfo.generate_id(data.id, ShopInfo.GOODS_TYPE_LEGENDCITY,
                                       req.index)
        shop = data.shop_list.get(shop_id)
        pay = shop.calc_goods_price(req.goods.id)
        extra_pay = int(pay * (req.tax / 100.0))

        if not shop_business.buy_goods(data, shop, req.goods.id, timer.now,
                                       req.tax):
            raise Exception("Buy Goods failed")

        compare.check_item(data, req.item)

        #请求 Unit 模块,缴税
        unit_req = unit_pb2.UnitBuyGoodsReq()
        unit_req.user_id = data.id
        unit_req.pay = pay
        unit_req.extra_pay = extra_pay
        unit_req.tax = req.tax
        defer = GlobalObject().remote['unit'].callRemote(
            "buy_goods", req.index, unit_req.SerializeToString())
        defer.addCallback(self._pack_buy_legendcity_goods_response, data, req,
                          timer)
        return defer
Ejemplo n.º 7
0
    def _calc_upgrade_equipment_stone(self, data, req, timer):
        """装备上的宝石升级逻辑
        """
        hero_id = HeroInfo.generate_id(data.id, req.hero.basic_id)
        hero = data.hero_list.get(hero_id)

        if hero is None:
            raise Exception("Hero not exist")

        if len(req.hero.stone_weapon) != 0:
            equipment_type = HeroInfo.EQUIPMENT_TYPE_WEAPON
            equipment_stones_id = req.hero.stone_weapon
        elif len(req.hero.stone_armor) != 0:
            equipment_type = HeroInfo.EQUIPMENT_TYPE_ARMOR
            equipment_stones_id = req.hero.stone_armor
        elif len(req.hero.stone_treasure) != 0:
            equipment_type = HeroInfo.EQUIPMENT_TYPE_TREASURE
            equipment_stones_id = req.hero.stone_treasure
        else:
            raise Exception("Equipment type error")

        if not hero_business.upgrade_equipment_stone(data, req.hero.basic_id,
                req.item.basic_id, equipment_type, equipment_stones_id, timer.now):
            raise Exception("Upgrade equipment stone failed")

        #验证
        compare.check_hero(data, req.hero, with_equipment_type = equipment_type, 
                with_equipment_stone = True)
        compare.check_item(data, req.item)

        return DataBase().commit(data)
Ejemplo n.º 8
0
    def _calc_demount_equipment_stone(self, data, req, timer):
        """装备卸下宝石逻辑
        """
        heroes_basic_id = []
        equipments_type = []
        equipments_stones_id =[]

        for hero_info in req.heros:
            heroes_basic_id.append(hero_info.basic_id)
            
            if len(hero_info.stone_weapon) != 0:
                equipments_type.append(HeroInfo.EQUIPMENT_TYPE_WEAPON)
                equipments_stones_id.append(hero_info.stone_weapon)
            elif len(hero_info.stone_armor) != 0:
                equipments_type.append(HeroInfo.EQUIPMENT_TYPE_ARMOR)
                equipments_stones_id.append(hero_info.stone_armor)
            elif len(hero_info.stone_treasure) != 0:
                equipments_type.append(HeroInfo.EQUIPMENT_TYPE_TREASURE)
                equipments_stones_id.append(hero_info.stone_treasure)
            else:
                raise Exception("Equipment type error")

        item_list = []
        if not hero_business.demount_equipment_stone(data, heroes_basic_id,
                equipments_type, equipments_stones_id, req.item.basic_id, timer.now):
            raise Exception("Demount equipment stone failed")

        #验证
        for i in range(len(req.heros)):
            compare.check_hero(data, req.heros[i], with_equipment_type = equipments_type[i],
                with_equipment_stone = True)
        compare.check_item(data, req.item)

        return DataBase().commit(data)
Ejemplo n.º 9
0
    def _calc_buy_goods(self, data, req, timer):
        union = data.union.get()
        if not union.is_belong_to_target_union(req.index):
            #玩家不属于联盟
            logger.debug("User is not belong to union")
            res = wineShop_pb2.BuyGoodsRes()
            res.status = 0
            res.invalid = True

        else:
            shop_id = ShopInfo.generate_id(data.id, req.goods.type)
            shop = data.shop_list.get(shop_id)
            if not shop_business.buy_goods(data, shop, req.goods.id,
                                           timer.now):
                raise Exception("Buy Goods failed")

            compare.check_item(data, req.item)

            res = wineShop_pb2.BuyGoodsRes()
            res.status = 0
            pack.pack_resource_info(data.resource.get(True), res.resource)
            res.current_tokens = union.honor

        defer = DataBase().commit(data)
        defer.addCallback(self._buy_goods_succeed, req, res, timer)
        return defer
Ejemplo n.º 10
0
    def _calc_own_finish_result(self, union_response, rival_union_res, win,
                                own_soldier_info, enemy_soldier_info, data,
                                skip, heroes, req, timer):
        union_res = internal_union_pb2.InternalFinishUnionBattleRes()
        union_res.ParseFromString(union_response)
        if union_res.status != 0:
            raise Exception("Query union battle res error")

        score = 0
        if union_res.HasField("individual_battle_score_add"):
            score = union_res.individual_battle_score_add

        #结束战斗
        if win:
            if not union_battle_business.win_battle(data, enemy_soldier_info,
                                                    own_soldier_info, score,
                                                    timer.now):
                raise Exception("Win battle failed")
        else:
            if not union_battle_business.lose_battle(data, enemy_soldier_info,
                                                     own_soldier_info, score,
                                                     timer.now):
                raise Exception("Lose battle failed")

        #检查请求
        if win:
            compare.check_user(data, req.monarch, with_level=True)
            for info in req.battle.attack_heroes:
                compare.check_hero(data, info.hero, with_level=True)
            for item_info in req.items:
                compare.check_item(data, item_info)

        res = union_battle_pb2.FinishUnionBattleRes()
        res.status = 0
        if union_res.ret != union_pb2.UNION_OK:
            res.ret = union_res.ret
        else:
            res.ret = rival_union_res.ret

        if skip:
            pack.pack_monarch_info(data.user.get(True), res.monarch)
            if win:
                res.battle_output.result = battle_pb2.BattleOutputInfo.WIN
            else:
                res.battle_output.result = battle_pb2.BattleOutputInfo.LOSE

            for i, hero in enumerate(heroes):
                attack_hero = res.battle_output.attack_heroes.add()
                pack.pack_hero_info(hero, attack_hero.hero, timer.now)
                attack_hero.soldier_survival = own_soldier_info[i][2]

        if union_res.HasField("battle") and rival_union_res.HasField("battle"):
            defer = UnionBattlePatcher().patch_by_both_message(
                res.battle, union_res.battle, rival_union_res.battle, data,
                timer.now)
            defer.addCallback(self._calc_finish_post, data, req, res, timer)
            return defer

        return self._calc_finish_post(None, data, req, res, timer)
Ejemplo n.º 11
0
    def _calc_get_pass_reward(self, data, req, timer):
        anneal = data.anneal.get()
        if not anneal_business.get_pass_reward(data, anneal, req.mode_type):
            raise Exception("Anneal get pass reward failed")

        #验证客户端正确性
        for item_info in req.items:
            compare.check_item(data, item_info)

        return DataBase().commit(data)
Ejemplo n.º 12
0
    def _calc_upgrade_star(self, data, req, timer):
        """重现客户端升星计算逻辑,和请求进行比较
        """
        res = hero_pb2.UpdateHeroRes()
        res.status = 0

        hero_id = HeroInfo.generate_id(data.id, req.hero.basic_id)
        hero = data.hero_list.get(hero_id)
        item_id = ItemInfo.generate_id(data.id, req.item[0].basic_id)
        item = data.item_list.get(item_id)

        if hero is None or item is None:
            raise Exception("Hero or item not exist")

        #消耗精魄
        soul_num = 0
        open_flags = account_business.get_flags()
        if "HeroUpStarUseSoul" in open_flags:
            soul_num = data_loader.HeroStarLevelBasicInfo_dict[
                req.hero.star_level].soul

        #使用灵魂石
        consume_num = data_loader.HeroStarLevelBasicInfo_dict[
            req.hero.star_level].perceptivity
        ret = hero_business.star_upgrade(data, hero, item, consume_num,
                                         soul_num, timer.now)
        if ret != hero_pb2.HERO_OK:
            res.ret = ret
            return self._upgrade_star_succeed(data, req, res, timer)

        #和请求进行比较
        if req.hero.star_level != hero.star:
            raise Exception("Unexpect hero star[expect star=%d]" % hero.star)

        #验证
        compare.check_hero(data, req.hero, with_star=True)
        compare.check_item(data, req.item[0])

        resource = data.resource.get()
        resource.update_current_resource(timer.now)

        res.ret = hero_pb2.HERO_OK
        pack.pack_resource_info(resource, res.resource)

        try:
            if hero.is_need_broadcast_star_level():
                self._add_upgrade_star_level_broadcast(data.user.get(), hero)
        except:
            logger.warning("Send upgrade star level broadcast failed")

        defer = DataBase().commit(data)
        defer.addCallback(self._upgrade_star_succeed, req, res, timer)
        return defer
Ejemplo n.º 13
0
    def _calc_buy_goods(self, data, req, timer):
        #涉及到跨天的数据统计,所以此处要更新所有跨天数据
        if not account_business.update_across_day_info(data, timer.now):
            raise Exception("Update across day info failed")

        shop_id = ShopInfo.generate_id(data.id, req.goods.type)
        shop = data.shop_list.get(shop_id)

        if not shop_business.buy_goods(data, shop, req.goods.id, timer.now):
            raise Exception("Buy Goods failed")

        compare.check_item(data, req.item)

        defer = DataBase().commit(data)
        return defer
Ejemplo n.º 14
0
    def _calc_refresh_goods(self, data, req, types, timer):
        #涉及到跨天的数据统计,所以此处要更新所有跨天数据
        if not account_business.update_across_day_info(data, timer.now):
            raise Exception("Update across day info failed")

        shops = []
        index = 1
        if req.HasField("index"):
            index = req.index
        for type in types:
            shop_id = ShopInfo.generate_id(data.id, type, index)
            shops.append(data.shop_list.get(shop_id))

        is_refresh_with_item = False
        refresh_item = None
        if req.HasField("item"):
            #用刷新代币刷新商铺
            is_refresh_with_item = True
            item_id = ItemInfo.generate_id(data.id, req.item.basic_id)
            refresh_item = data.item_list.get(item_id)
            if refresh_item is None:
                raise Exception("Item not exist")

        free = False
        if shops[0].is_able_to_refresh_free(timer.now):
            free = True

        goods = []
        if not shop_business.refresh_goods(data, shops, goods, timer.now,
                                           refresh_item, free):
            raise Exception("Refresh goods failed")

        if is_refresh_with_item:
            compare.check_item(data, req.item)

        resource = data.resource.get(True)
        #任意选择一个商店的刷新次数
        res = self._pack_refresh_goods_response(goods, shops[0], resource, req,
                                                timer.now)

        defer = DataBase().commit(data)
        defer.addCallback(self._refresh_goods_succeed, types, req, res, timer)
        return defer
Ejemplo n.º 15
0
    def _calc_upgrade_equipment(self, data, req, timer):
        #涉及到跨天的数据统计,所以此处要更新所有跨天数据
        if not account_business.update_across_day_info(data, timer.now):
            raise Exception("Update across day info failed")

        cost_gold = 0
        if req.HasField("gold"):
            cost_gold = req.gold

        if not hero_business.equipment_upgrade(
                data, req.hero.basic_id, req.type, cost_gold, timer.now):
            raise Exception("Upgrade equipment failed")

        #验证
        compare.check_hero(data, req.hero, with_equipment_type = req.type)
        for item_info in req.items:
            compare.check_item(data, item_info)

        return DataBase().commit(data)
Ejemplo n.º 16
0
    def _calc_buy_buff(self, data, req, timer):
        city_id = LegendCityInfo.generate_id(data.id, req.city_id)
        legendcity = data.legendcity_list.get(city_id)

        if req.HasField("item"):
            #消耗物品获得 buff
            item_id = ItemInfo.generate_id(data.id, req.item.basic_id)
            item = data.item_list.get(item_id)
            if not item.use_legendcity_buff_item():
                raise Exception("Use legendcity buff item failed")

            #检查 buff 和 item 是否匹配
            if not legendcity.check_buff_available(req.city_buff_id,
                                                   req.item.basic_id):
                raise Exception("Check buff available failed")
        else:
            #消耗元宝获得 buff
            need = legendcity.get_buff_gold_cost(req.city_buff_id)
            if need != req.gold:
                raise Exception("Unmatch gold cost[need=%d][cost=%d]" %
                                (need, req.gold))
            resource = data.resource.get()
            original_gold = resource.gold
            if not resource.cost_gold(need):
                raise Exception("Cost gold failed")
            log = log_formater.output_gold(data,
                                           -need,
                                           log_formater.LEGENDCITY_BUY_BUFF,
                                           "Buy buff by gold",
                                           before_gold=original_gold)
            logger.notice(log)

        if not legendcity.add_buff(req.city_buff_id, timer.now):
            raise Exception("Add legendcity buff failed")

        if req.HasField("item"):
            compare.check_item(data, req.item)

        defer = DataBase().commit(data)
        defer.addCallback(self._buy_buff_succeed, req, timer)
        return defer
Ejemplo n.º 17
0
    def _calc_open_chest(self, data, req, timer):
        """打开红包
            Args:
        """
        chest = data.chest.get()
        chest_old = chest_business.open_chest(data, chest, timer.now)
        if chest_old is None:
            raise Exception("Open chest failed")
        
        for i in range(0, len(req.items)):
            compare.check_item(data, req.items[i])

        #广播
        try:
            self._add_chest_broadcast(data, chest_old.gold)
        except:
            logger.warning("Send open chest broadcast failed")

        defer = DataBase().commit(data)
        defer.addCallback(self._open_chest_succeed, req, chest_old, timer)
        return defer
Ejemplo n.º 18
0
    def _calc_finish_question(self, data, req, timer):
        """结束问答逻辑
        """
        node_basic_id = req.node.basic_id
        node_id = NodeInfo.generate_id(data.id, node_basic_id)
        node = data.node_list.get(node_id)

        if not question_business.finish_question_event(
                data, node, req.question_id, req.answer, req.correct,
                timer.now):
            raise Exception("Finish question failed")

        #验证
        if req.HasField("hero"):
            compare.check_hero(data,
                               req.hero,
                               with_level=True,
                               with_soldier=True)
        for item_info in req.items:
            compare.check_item(data, item_info)

        return DataBase().commit(data)
Ejemplo n.º 19
0
    def _calc_awaken(self, data, req, timer):
        res = hero_pb2.AwakeningHeroRes()
        res.status = 0

        temple = None
        for building in data.building_list.get_all(True):
            if building.is_temple():
                temple = building
                break

        if temple is None or temple.level < int(
                float(
                    data_loader.
                    OtherBasicInfo_dict['unlock_hero_awakening_level'].value)):
            res.return_ret = hero_pb2.AwakeningHeroRes.ERROR_BUILDING
            return self._awaken_succeed(data, req, res, timer)

        hero = hero_business.get_hero_by_id(data, req.hero.basic_id)
        if hero is None:
            res.return_ret = hero_pb2.AwakeningHeroRes.ERROR_HERO
            return self._awaken_succeed(data, req, res, timer)

        ret = hero_business.awaken_hero(data, hero, timer.now)
        if ret != hero_pb2.AwakeningHeroRes.SUCCESS:
            res.return_ret = ret
            return self._awaken_succeed(data, req, res, timer)

        try:
            compare.check_hero(data, req.hero, with_awaken=True)
            for item_info in req.items:
                compare.check_item(data, item_info)
        except:
            res.return_ret = hero_pb2.AwakeningHeroRes.INVALID
            return self._awaken_succeed(data, req, res, timer)

        res.return_ret = hero_pb2.AwakeningHeroRes.SUCCESS
        defer = DataBase().commit(data)
        defer.addCallback(self._awaken_succeed, req, res, timer)
        return defer
Ejemplo n.º 20
0
    def _calc_enchant_equipment(self, data, req, timer):
        #涉及到跨天的数据统计,所以此处要更新所有跨天数据
        if not account_business.update_across_day_info(data, timer.now):
            raise Exception("Update across day info failed")

        #精炼后的装备 id
        if req.type == HeroInfo.EQUIPMENT_TYPE_WEAPON:
            dest_equipment_id = req.hero.equipment_weapon_id
        elif req.type == HeroInfo.EQUIPMENT_TYPE_ARMOR:
            dest_equipment_id = req.hero.equipment_armor_id
        elif req.type == HeroInfo.EQUIPMENT_TYPE_TREASURE:
            dest_equipment_id = req.hero.equipment_treasure_id
        else:
            raise Exception("Invalid input equipment type[type=%d]" % req.type)

        #精炼消耗的材料
        cost_item = []
        for item_info in req.items:
            item_id = ItemInfo.generate_id(data.id, item_info.basic_id)
            item = data.item_list.get(item_id)
            cost_num = item.num - item_info.num
            cost_item.append((item.id, cost_num))

        #精炼消耗的元宝
        cost_gold = 0
        if req.HasField("gold"):
            cost_gold = req.gold

        if not hero_business.equipment_enchant(
                data, req.hero.basic_id, req.type, dest_equipment_id,
                cost_item, cost_gold, timer.now):
            raise Exception("Enchant equipment failed")

        #验证
        compare.check_hero(data, req.hero, with_equipment_type = req.type)
        for item_info in req.items:
            compare.check_item(data, item_info)

        return DataBase().commit(data)
Ejemplo n.º 21
0
    def _calc_finish_visit(self, data, req, timer):
        """结束探访逻辑
        """
        #涉及到跨天的数据统计,所以此处要更新所有跨天数据
        if not account_business.update_across_day_info(data, timer.now):
            raise Exception("Update across day info failed")

        node_basic_id = req.node.basic_id
        node_id = NodeInfo.generate_id(data.id, node_basic_id)
        node = data.node_list.get(node_id)

        gold = 0
        if req.HasField("gold"):
            gold = req.gold

        candidate = []
        if not visit_business.finish_visit_event(data, node, req.visit_id,
                                                 timer.now, gold):
            raise Exception("Finish visit failed")

        #验证
        if req.HasField("hero"):
            compare.check_hero(data, req.hero)
        if req.HasField("item"):
            compare.check_item(data, req.item)

        #获得S级武将要播广播
        if req.visit_id != 0:
            hero_basic_id = data_loader.EventVisitBasicInfo_dict[
                req.visit_id].heroBasicId
            if hero_basic_id != 0 and hero_business.is_need_broadcast(
                    hero_basic_id):
                try:
                    self._add_get_hero_broadcast(data.user.get(),
                                                 hero_basic_id)
                except:
                    logger.warning("Send get hero broadcast failed")

        return DataBase().commit(data)
Ejemplo n.º 22
0
    def _calc_buy_attack_num(self, data, req, timer):
        """
        """
        #涉及到跨天的数据统计,所以此处要更新所有跨天数据
        if not account_business.update_across_day_info(data, timer.now):
            raise Exception("Update across day info failed")

        anneal = data.anneal.get()
        anneal.update_current_attack_num(timer.now)

        item = None
        if req.HasField("item"):
            item_id = ItemInfo.generate_id(data.id, req.item.basic_id)
            item = data.item_list.get(item_id)

        need_gold, original_gold = anneal_business.buy_attack_num(
            data, anneal, item, timer.now)
        if need_gold < 0:
            raise Exception("Buy attack num failed")

        #记录次数
        #trainer = data.trainer.get()
        #trainer.add_daily_buy_attack_num(1)

        if req.HasField("item"):
            compare.check_item(data, req.item)

        if need_gold > 0:
            log = log_formater.output_gold(
                data,
                -need_gold,
                log_formater.BUY_ATTACK_NUM,
                "Buy attack num by gold",
                before_gold=original_gold,
                attack_num=anneal.get_attack_num_of_buy())
            logger.notice(log)

        return DataBase().commit(data)
Ejemplo n.º 23
0
    def _calc_get_melee_win_num_reward(self, data, req, timer):
        user = data.user.get()
        melee = data.melee.get()
        if not melee.is_able_to_unlock(user):
            raise Exception("melee is not unlock[user_level=%d]" % user.level)

        if not melee_business.get_melee_win_num_reward(data, melee, timer.now):
            raise Exception("melee get win num reward failed")

        #验证客户端正确性
        for item_info in req.items:
            compare.check_item(data, item_info)

        melee_matcher = MeleeMatcher()
        if melee.need_query_rank():
            defer = melee_matcher.query_ranking(data, melee)
        else:
            defer = Deferred()
            defer.callback(True)

        defer.addCallback(self._pack_get_melee_win_num_reward_response,
                data, melee, melee_matcher, req, timer)
        return defer
Ejemplo n.º 24
0
    def _calc_get_arena_win_num_reward(self, data, req, timer):
        user = data.user.get()
        if not user.allow_pvp_arena:
            raise Exception("Arena is not unlock[user_level=%d]" % user.level)

        arena = data.arena.get()
        if not arena_business.get_arena_win_num_reward(data, arena, timer.now):
            raise Exception("Arena get win num reward failed")

        #验证客户端正确性
        for item_info in req.items:
            compare.check_item(data, item_info)

        arena_matcher = ArenaMatcher()
        if arena.need_query_rank():
            defer = arena_matcher.query_ranking(data, arena)
        else:
            defer = Deferred()
            defer.callback(True)

        defer.addCallback(self._pack_get_arena_win_num_reward_response, data,
                          arena, arena_matcher, req, timer)
        return defer
Ejemplo n.º 25
0
    def _calc_upgrade_evolution_level(self, data, req, timer):
        """重现客户端升星计算逻辑,和请求进行比较
        """
        hero_id = HeroInfo.generate_id(data.id, req.hero.basic_id)
        hero = data.hero_list.get(hero_id)
        item_id = ItemInfo.generate_id(data.id, req.item[0].basic_id)
        item = data.item_list.get(item_id)

        if hero is None or item is None:
            raise Exception("Hero or item not exist")

        #使用突破石
        consume_num = item.num - req.item[0].num
        if not hero_business.evolution_level_upgrade(data, hero, item,
                                                     consume_num, timer.now):
            raise Exception("Hero evolution level upgrade failed]")

        #和请求进行比较
        if req.hero.evolution_level != hero.evolution_level:
            raise Exception(
                "Unexpect hero evolution level[expect evolution level=%d]" %
                hero.evolution_level)

        #验证
        compare.check_hero(data, req.hero, with_evolution=True)
        compare.check_item(data, req.item[0])

        if hero.is_need_broadcast():
            #玩家英雄达到一定等级时,广播
            try:
                self._add_upgrade_evolution_level_broadcast(
                    data.user.get(), hero)
            except:
                logger.warning("Send upgrade evolution level broadcast failed")

        return DataBase().commit(data)
Ejemplo n.º 26
0
    def _calc_draw(self, data, basic_data, req, type, timer):
        #涉及到跨天的数据统计,所以此处要更新所有跨天数据
        if not account_business.update_across_day_info(data, timer.now):
            raise Exception("Update across day info failed")

        user = data.user.get()
        resource = data.resource.get()
        draw = data.draw.get()

        resource.update_current_resource(timer.now)

        is_draw_with_item = False
        draw_item = None
        if req.HasField("item"):
            #用抽奖券抽
            is_draw_with_item = True
            item_id = ItemInfo.generate_id(data.id, req.item.basic_id)
            draw_item = data.item_list.get(item_id)
            if draw_item is None:
                raise Exception("Item not exist")

        hero_list = []
        item_list = []
        if type == self._TYPE_GOLD_DRAW:
            if not draw_business.draw_with_gold(
                    basic_data, data, user, resource, draw,
                    hero_list, item_list, timer.now, draw_item, req.free):
                raise Exception("Draw with gold failed")
        elif type == self._TYPE_MONEY_DRAW:
            if not draw_business.draw_with_money(
                    user, resource, draw, hero_list, item_list, timer.now, draw_item, req.free):
                raise Exception("Draw with money failed")
        elif type == self._TYPE_GOLD_MULTI_DRAW:
            if not draw_business.multi_draw_with_gold(
                    basic_data, data, user, resource, draw, hero_list, item_list, 
                    timer.now, draw_item):
                raise Exception("Multi draw with gold failed")
        elif type == self._TYPE_MONEY_MULTI_DRAW:
            if not draw_business.multi_draw_with_money(
                    user, resource, draw, hero_list, item_list, timer.now, draw_item):
                raise Exception("Multi draw with money failed")
        #elif type == self._TYPE_TREASURE_DRAW:
        #    pass
        #elif type == self._TYPE_TREASURE_MULTI_DRAW:
        #    pass 
        else:
            raise Exception("Invalid draw type[type=%d]" % type)

        #添加抽奖得到的英雄和物品
        for (hero_basic_id, hero_num) in hero_list:
            if not hero_business.gain_hero(data, hero_basic_id, hero_num):
                raise Exception("Gain hero failed")
        if not item_business.gain_item(data, item_list, "draw ", log_formater.DRAW):
            raise Exception("Gain item failed")

        if is_draw_with_item:
            compare.check_item(data, req.item)

        #获得S级武将要播广播
        for (hero_basic_id, hero_num) in hero_list:
            if hero_business.is_need_broadcast(hero_basic_id):
                try:
                    self._add_get_hero_broadcast(data.user.get(), draw, hero_basic_id)
                except:
                    logger.warning("Send get hero broadcast failed")

        #构造返回
        if type == self._TYPE_GOLD_DRAW or type == self._TYPE_GOLD_MULTI_DRAW:
            free_num = draw.gold_draw_free_num
            free_time = draw.gold_draw_free_time
        else:
            free_num = draw.money_draw_free_num
            free_time = draw.money_draw_free_time

        res = self._pack_draw_response(data, hero_list, item_list, resource,
                free_num, free_time, timer.now)

        defer = DataBase().commit(data)
        defer.addCallback(self._draw_succeed, type, req, res, timer)
        return defer
Ejemplo n.º 27
0
    def _calc_start_appoint(self, data, req, timer):
        item_id = ItemInfo.generate_id(data.id, req.item.basic_id)
        item = data.item_list.get(item_id)
        if item is None:
            raise Exception("Item not exist")

        #扣减1个虎符
        if not item.use_appoint_item(1):
            raise Exception("Use appoint item failed")

        compare.check_item(data, req.item)

        #参战team/英雄
        teams = []
        heroes = []
        for team in req.battle.attack_teams:
            team_id = TeamInfo.generate_id(data.id, team.index)
            team = data.team_list.get(team_id)
            if team is None:
                continue

            teams.append(team)

            for hero_id in team.get_heroes():
                if hero_id != 0:
                    hero = data.hero_list.get(hero_id)
                    heroes.append(hero)

        if len(teams) == 0:
            raise Exception("Appoint teams is NULL")

        #敌人信息
        node_basic_id = req.node.basic_id
        node_id = NodeInfo.generate_id(data.id, node_basic_id)
        rival_id = node_id
        node = data.node_list.get(node_id)
        rival = data.rival_list.get(rival_id)

        if node.rival_type in (NodeInfo.ENEMY_TYPE_PVE_BANDIT,
                               NodeInfo.ENEMY_TYPE_PVE_REBEL):
            """山贼"""
            rival.reward_user_exp = int(
                float(data_loader.
                      OtherBasicInfo_dict['bandit_battle_cost_energy'].value))
        else:
            """侦察敌军"""
            rival.reward_user_exp = int(
                float(data_loader.
                      OtherBasicInfo_dict['keynode_battle_cost_energy'].value))

        user = data.user.get()
        if not appoint_business.start_appoint(
                data, user, node, rival, teams, heroes, timer.now, force=True):
            raise Exception("Start appoint failed")

        #构造返回
        res = self._pack_start_appoint_response(data, timer.now)

        defer = DataBase().commit(data)
        defer.addCallback(self._start_appoint_succeed, node, rival, req, res,
                          timer)
        return defer
Ejemplo n.º 28
0
    def _calc_finish_battle(self, data, req, timer):
        #兵力信息
        res = union_boss_pb2.FinishUnionBossBattleRes()
        res.status = 0

        own_soldier_info = []
        for result in req.battle.attack_heroes:
            hero_basic_id = result.hero.basic_id
            hero = hero_business.get_hero_by_id(data, hero_basic_id)
            own_soldier_info.append((
                hero.soldier_basic_id,
                hero.soldier_level,
                result.soldier_survival))
        enemy_soldier_info = []
        if req.battle.HasField("relive_times"):
            for i in range(req.battle.relive_times):
                for result in req.battle.defence_heroes:
                    #攻打世界boss时有重生逻辑,实际杀敌会更多
                    enemy_soldier_info.append((
                        result.hero.soldier_basic_id,
                        result.hero.soldier_level,
                        0))
                        
        for result in req.battle.defence_heroes:
            enemy_soldier_info.append((
                result.hero.soldier_basic_id,
                result.hero.soldier_level,
                result.soldier_survival))

        #计算杀敌数
        kill_soldier_num = battle_business._calc_number_of_death(enemy_soldier_info)

        node_id = NodeInfo.generate_id(data.id, UserUnionInfo.get_union_boss_node_basic_id())
        node = data.node_list.get(node_id)
        rival = data.rival_list.get(node_id)
        boss = union_boss_business.get_boss_by_id(data, rival.rival_id)
        
        change_nodes = []
        new_items = []
        new_mails = []
        new_arena_records = []
        if req.battle.result == req.battle.WIN:
            win = True
            if not battle_business.win_battle(
                data, node, enemy_soldier_info, own_soldier_info,
                change_nodes, timer.now, new_arena_records, is_unionboss=True):
                raise Exception("win union boss battle failed")
        else:
            win = False
            if not battle_business.lose_battle(
                data, node, timer.now, enemy_soldier_info, own_soldier_info,
                change_nodes, new_items, new_mails, new_arena_records):
                raise Exception("loss union boss battle failed")

        union_boss_business.finish_battle(data, boss, win, kill_soldier_num)

        if req.battle.result == req.battle.WIN:
            if not compare.check_user_r(data, req.monarch, with_level=True):
                res.battle_ret = union_pb2.BATTLE_MONARCH_ERROR
                return self._finish_battle_succeed(data, req, res, timer)

            for info in req.battle.attack_heroes:
                if not compare.check_hero_r(data, info.hero, with_level=True):
                    res.battle_ret = union_pb2.BATTLE_HERO_ERROR
                    return self._finish_battle_succeed(data, req, res, timer)
            
            for item_info in req.items:
                compare.check_item(data, item_info)

        #请求gunion模块
        user = data.user.get(True)
        union_req = internal_union_pb2.InternalSyncBossReq()
        union_req.user_id = data.id
        union_req.user_name = user.name
        union_req.boss_id = boss.boss_id
        union_req.kill_addition = kill_soldier_num

        defer = GlobalObject().remote['gunion'].callRemote(
            "sync_unionboss", req.union_id, union_req.SerializeToString())
        defer.addCallback(self._calc_finish_battle_result, data, req,
                own_soldier_info, enemy_soldier_info, kill_soldier_num, boss, timer)
        return defer