Beispiel #1
0
    def _use_valid_cdkey(self, data, key, goodybag_id):
        """使用有效的 cdkey,获得奖励
        """
        bag = data_loader.GoodyBagBasicInfo_dict[goodybag_id]
        resource = data.resource.get()
        original_gold = resource.gold
        if bag.gold > 0:
            resource.gain_gold(bag.gold)
            log = log_formater.output_gold(data,
                                           bag.gold,
                                           log_formater.BAG_GOLD,
                                           "Gain gold frome bag",
                                           before_gold=original_gold)
            logger.notice(log)

        if bag.money > 0:
            resource.gain_money(bag.money)
        if bag.food > 0:
            resource.gain_food(bag.food)

        assert len(bag.itemsBasicId) == len(bag.itemsNum)
        item_list = []
        for i in range(0, len(bag.itemsBasicId)):
            item_list.append((bag.itemsBasicId[i], bag.itemsNum[i]))

        if not item_business.gain_item(data, item_list, "cdkey reward",
                                       log_formater.CDKEY_REWARD):
            raise Exception("Gain item failed")

        return self._pack_valid_cdkey_response(data, goodybag_id, resource,
                                               item_list)
Beispiel #2
0
def reset_hard_attack_num(data, floor, now, ret):
    """重置困难模式攻击次数"""
    #1.消耗元宝
    #2.清空次数
    user = data.user.get(True)
    resource = data.resource.get()
    resource.update_current_resource(now)
    anneal = data.anneal.get()

    buy_num = anneal.get_hard_reset_num(floor) + 1
    if buy_num not in data_loader.AnnealHardAttackNumBuyData_dict:
        ret.setup("VIP_NOT_ENOUGH")
        return False

    if user.vip_level < data_loader.AnnealHardAttackNumBuyData_dict[
            buy_num].limitVipLevel:
        ret.setup("VIP_NOT_ENOUGH")
        return False

    original_gold = resource.gold
    cost_gold = data_loader.AnnealHardAttackNumBuyData_dict[buy_num].gold
    if not resource.cost_gold(cost_gold):
        ret.setup("GOLD_NOT_ENOUGH")
        return False
    log = log_formater.output_gold(data,
                                   -cost_gold,
                                   log_formater.RESET_HARD_ATTACK,
                                   "reset hard attack num by gold",
                                   before_gold=original_gold)
    logger.notice(log)
    anneal.reset_hard_attack_num(floor)
    return True
Beispiel #3
0
def treasure_draw(basic_data, data, user, resource, draw, item_list, req, now):
    need_gold = 0
    original_gold = resource.gold
    if req.times == 1:
        need_gold = int(
            float(data_loader.OtherBasicInfo_dict["TurntableSearchOneCost"].
                  value))
    elif req.times == 10:
        need_gold = int(
            float(data_loader.OtherBasicInfo_dict["TurntableSearchTenCost"].
                  value))
    else:
        raise Exception("Treasure draw times error")
    if not resource.cost_gold(need_gold):
        return False
    log = log_formater.output_gold(data, -need_gold, log_formater.TURN_DRAW,
                                   "turn draw cost")
    logger.notice(log)
    if not draw.calc_treasure_draw_reward(basic_data, user, req, item_list):
        return False

    if need_gold > 0:
        _output_draw_by_gold(data, need_gold, original_gold,
                             log_formater.DRAW_ONE, "Treasure draw by gold",
                             item_list, [])

    _update_treasure_scores(basic_data, data, draw, req.times, now)

    return True
Beispiel #4
0
def _operate_activity_funds(basic_data, data, activity, op_type, op_input, step_id, now):
    """购买成长基金
    """
    #超过30级,不允许购买
    user = data.user.get(True)
    if user.level >= FUNDS_USER_LEVEL_LIMIT:
        logger.warning("User level invalid[level=%d]" % user.level)
        return False
    if user.vip_level < FUNDS_VIP_LEVEL_LIMIT:
        logger.warning("User vip level invalid[vip_level=%d]" % user.vip_level)
        return False

    resource = data.resource.get()
    original_gold = resource.gold
    gold = 1000
    if not resource.cost_gold(gold):
        return False

    #解锁基金
    activity.unlock_all_reward()

    log = log_formater.output_gold(data, -gold, log_formater.BUY_FUNDS,
            "Buy funds by gold", before_gold = original_gold, activity = activity.basic_id)
    logger.notice(log)
    return True
Beispiel #5
0
def accept_individual_step_award(data, target_step, now):
    """领取个人战功阶段奖励
    """
    user = data.user.get(True)

    award_index = data_loader.UnionBattleIndividualTargetInfo_dict[
        user.level].awardIndex[target_step - 1]
    award = data_loader.UnionBattleIndivStepAwardInfo_dict[award_index]

    #资源
    resource = data.resource.get()
    original_gold = resource.gold
    resource.update_current_resource(now)
    resource.gain_gold(award.gold)
    log = log_formater.output_gold(data,
                                   award.gold,
                                   log_formater.INDIVIDUAL_STEP_GOLD,
                                   "Gain gold from individual step award",
                                   before_gold=original_gold)
    logger.notice(log)

    #物品
    items = []
    for i in range(len(award.itemsBasicId)):
        items.append((award.itemsBasicId[i], award.itemsNum[i]))
    assert item_business.gain_item(data, items, "individual award",
                                   log_formater.INDIVIDUAL_AWARD)

    #联盟荣誉
    union = data.union.get()
    union.gain_honor(award.honor)

    return (award.honor, items)
Beispiel #6
0
def refresh_attack(data, cost_gold, now):
    """刷新攻击次数
    1 元宝
    2 vip 要求
    """
    user = data.user.get(True)
    union = data.union.get()

    (need_gold, need_vip_level) = union.calc_refresh_battle_requirement()
    if need_gold != cost_gold:
        logger.warning("Cost gold error[%d!=%d]" % (need_gold, cost_gold))
        return False
    if need_vip_level > user.vip_level:
        logger.warning("Vip level error[%d<%d]" %
                       (user.vip_level, need_vip_level))
        return False

    resource = data.resource.get()
    resource.update_current_resource(now)
    original_gold = resource.gold
    if not resource.cost_gold(cost_gold):
        return False
    log = log_formater.output_gold(data,
                                   -cost_gold,
                                   log_formater.REFRESH_ATTACK,
                                   "Refresh attack by gold",
                                   before_gold=original_gold)
    logger.notice(log)

    union.refresh_battle_attack()
    return True
Beispiel #7
0
def drum(data, item, cost_gold, score, now, drum_count=1):
    """擂鼓
    """
    #擂鼓,添加战功
    union = data.union.get()
    union.drum_for_union_battle(score, drum_count)

    #消耗物品或元宝
    output_items = []
    if item is not None:
        consume = item.consume(drum_count)
        output_items.append("[item=")
        output_items.append(utils.join_to_string(list(consume[1])))
        output_items.append("]")
        log = log_formater.output_item(data, "drum", log_formater.DRUM,
                                       ''.join(output_items))
        logger.notice(log)

    resource = data.resource.get()
    resource.update_current_resource(now)
    original_gold = resource.gold
    log = log_formater.output_gold(data,
                                   -cost_gold,
                                   log_formater.DRUM,
                                   "Drum by gold",
                                   before_gold=original_gold)
    logger.notice(log)
    return resource.cost_gold(cost_gold)
Beispiel #8
0
    def _calc_update(self, data, req, timer):
        """更新史实城信息
        请求 unit 模块
        """
        city_id = LegendCityInfo.generate_id(data.id, req.city_id)
        legendcity = data.legendcity_list.get(city_id)

        unit_req = unit_pb2.UnitUpdateLegendCityReq()
        unit_req.user_id = data.id
        if req.HasField("slogan"):
            unit_req.slogan = req.slogan
        if req.HasField("tax"):
            unit_req.tax = req.tax
        if req.HasField("gold"):
            #消耗元宝
            unit_req.gold = req.gold
            resource = data.resource.get()
            original_gold = resource.gold
            if not resource.cost_gold(req.gold):
                raise Exception("Cost gold failed")
            log = log_formater.output_gold(data,
                                           -req.gold,
                                           log_formater.LEGENDCITY_UPDATE,
                                           "Updata legendcity",
                                           before_gold=original_gold)
            logger.notice(log)

        defer = GlobalObject().remote['unit'].callRemote(
            "update_city_info", legendcity.city_id,
            unit_req.SerializeToString())
        defer.addCallback(self._check_update, data, req, timer)
        defer.addCallback(self._update_succeed, data, req, timer)
        return defer
Beispiel #9
0
    def _calc_buy_energy(self, data, req, timer):
        """
        """
        #涉及到跨天的数据统计,所以此处要更新所有跨天数据
        if not account_business.update_across_day_info(data, timer.now):
            raise Exception("Update across day info failed")

        energy = data.energy.get()
        energy.update_current_energy(timer.now)

        need_gold, original_gold = energy_business.buy_energy(
            data, energy, timer.now)
        if need_gold < 0:
            raise Exception("Buy energy failed")

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

        log = log_formater.output_gold(data,
                                       -need_gold,
                                       log_formater.BUY_ENERGY,
                                       "Buy energy by gold",
                                       before_gold=original_gold,
                                       energy=energy.get_energy_num_of_buy())
        logger.notice(log)

        return DataBase().commit(data)
Beispiel #10
0
    def _change_name(self, data, req):
        """
        """
        if not req.monarch.HasField("name"):
            raise Exception("Invalid request, empty name")

        user = data.user.get()
        gold_cost = user.calc_change_name_gold_cost()
        resource = data.resource.get()
        pay = data.pay.get(True)
        original_gold = resource.gold
        #新手引导期内改名字不扣元宝
        if user.is_basic_guide_finish():
            if not resource.cost_gold(gold_cost):
                raise Exception("Change user name failed")
        log = log_formater.output_gold(data,
                                       -gold_cost,
                                       log_formater.UPDATE_USER_NAME,
                                       "Update user name by gold",
                                       before_gold=original_gold)
        logger.notice(log)

        if not user.change_name(req.monarch.name):
            raise Exception("Change user name failed")

            logger.notice(
                "Submit Role[user_id=%d][level=%d][name=%s][vip=%d][status=CHANGE_NAME][create_time=%d][last_login_time=%d][money=%d][food=%d][gold=%d][pay_count=%d][pay_amount=%.2f]"
                %
                (user.id, user.level, user.name, user.vip_level,
                 user.create_time, user.last_login_time, resource.money,
                 resource.food, resource.gold, pay.pay_count, pay.pay_amount))
        defer = DataBase().commit(data)
        return defer
Beispiel #11
0
def refresh_pray(data, type, building_level, cost_gold, now):
    """
    """
    user = data.user.get()
    pray = data.pray.get()
    resource = data.resource.get()
    original_gold = resource.gold

    need_gold = pray.calc_refresh_gold_cost(type, user.vip_level)
    if need_gold is None:
        return (False, original_gold)

    if need_gold != cost_gold:
        logger.warning("pray gold cost is error[need_gold=%d][cost_gold=%d]" %
                       (need_gold, cost_gold))
        return (False, original_gold)

    if need_gold != 0 and not resource.cost_gold(need_gold):
        logger.warning("not enough gold[need_gold=%d][gold=%d]" %
                       (need_gold, resource.gold))
        return (False, original_gold)
    log = log_formater.output_gold(data,
                                   -need_gold,
                                   log_formater.REFRESH_PRAY,
                                   "Refresh pray by gold",
                                   before_gold=original_gold)
    logger.notice(log)

    if not pray.refresh(type):
        return (False, original_gold)

    return (True, original_gold)
Beispiel #12
0
    def _check_update_country_result(self, response, data, req, timer):
        res = monarch_pb2.UpdateCountryRes()
        res.ParseFromString(response)

        if res.status != 0:
            raise Exception("Check update country result failed")

        user = data.user.get()
        user.update_country(req.new_country)

        resource = data.resource.get()
        original_gold = resource.gold
        resource.gain_gold(req.reward_gold)
        log = log_formater.output_gold(data,
                                       req.reward_gold,
                                       log_formater.CHECK_UPDATE_COUNTRY,
                                       "Gain gold from check update country",
                                       before_gold=original_gold)
        logger.notice(log)

        resource.update_current_resource(timer.now)
        pack.pack_resource_info(resource, res.resource)

        defer = DataBase().commit(data)
        defer.addCallback(self._update_country_succeed, req, res, timer)
        return defer
Beispiel #13
0
def get_arena_win_num_reward(data, arena, now):
    """领取奖励
    """
    chest = data_loader.ChestInfo_dict[arena.chest_basic_id]

    #可以领取奖励
    resource = data.resource.get()
    original_gold = resource.gold
    reward_gold = int(float(chest.reward.gold))
    resource.update_current_resource(now)
    resource.gain_money(int(float(chest.reward.money)))
    resource.gain_food(int(float(chest.reward.food)))
    resource.gain_gold(reward_gold)
    log = log_formater.output_gold(data,
                                   reward_gold,
                                   log_formater.ARENA_REWORD_GOLD,
                                   "Gain gold from arena",
                                   before_gold=original_gold)
    logger.notice(log)

    assert len(chest.reward.itemBasicIds) == len(chest.reward.itemNums)
    new_items = []
    for i in range(len(chest.reward.itemBasicIds)):
        basic_id = chest.reward.itemBasicIds[i]
        num = chest.reward.itemNums[i]
        new_items.append((basic_id, num))

    if not item_business.gain_item(data, new_items, "arena reward",
                                   log_formater.ARENA_REWARD):
        return False

    if not arena.get_win_num_reward():
        return False

    return True
Beispiel #14
0
def reward_donate_box(user_data, reward, box_id, timer):
    """领取捐献箱奖励"""
    id = UserDonateBox.generate_id(user_data.id, box_id)
    donate_box = user_data.userdonatebox_list.get(id)
    if donate_box == None:
        raise Exception("No such box in donate_box list")
    donate_box.reward_donate_box()

    resource = user_data.resource.get()
    resource.update_current_resource(timer.now)
    original_gold = resource.gold
    resource.gain_money(reward.resource.money)
    resource.gain_food(reward.resource.food)
    resource.gain_gold(reward.resource.gold)
    log = log_formater.output_gold(user_data,
                                   reward.resource.gold,
                                   log_formater.DONATE_REWARD_GOLD,
                                   "Gain gold from donate box",
                                   before_gold=original_gold)
    logger.notice(log)

    item_list = []
    for i, id in enumerate(reward.item_id):
        item_list.append([id, reward.item_num[i]])

    item_business.gain_item(user_data, item_list, "donate reward",
                            log_formater.DONATE_REWARD)
Beispiel #15
0
def refresh_arena(data, arena, now):
    """刷新竞技场对手
    """
    resource = data.resource.get()
    original_gold = resource.gold
    resource.update_current_resource(now)

    #花费元宝
    gold_cost = arena.calc_gold_consume_of_refresh()
    if not resource.cost_gold(gold_cost):
        return False

    #刷新对手
    arena.refresh()

    if gold_cost > 0:
        log = log_formater.output_gold(data,
                                       -gold_cost,
                                       log_formater.REFRESH_ARENA,
                                       "Refresh arena by gold",
                                       before_gold=original_gold,
                                       rival_num=3)
        logger.notice(log)

    return True
Beispiel #16
0
def open_chest(data, chest, now):

    if not chest.is_in_duration(now):
        logger.warning("Open chest not in duration[start=%d][now=%d]" %
                       (chest.next_start_time, now))
        #return None

    items_info = chest.get_items_info()
    #领取物品奖励
    if not item_business.gain_item(data, items_info, "chest reward",
                                   log_formater.CHEST_REWARD):
        return None

    result = copy.deepcopy(chest)
    result._calc_next_start_time(now)

    #领取资源奖励
    resource = data.resource.get()
    original_gold = resource.gold
    resource.update_current_resource(now)
    chest_reward_gold = int(float(chest.gold))
    resource.gain_money(int(float(chest.money)))
    resource.gain_food(int(float(chest.food)))
    resource.gain_gold(chest_reward_gold)
    log = log_formater.output_gold(data,
                                   chest_reward_gold,
                                   log_formater.CHEST_REWARD_GOLD,
                                   "Gain gold from chest",
                                   before_gold=original_gold)
    logger.notice(log)

    chest.update_info(now)
    return result
Beispiel #17
0
    def _calc_reset(self, data, req, timer):
        res = union_boss_pb2.RefreshUnionBossAttackRes()
        res.status = 0

        union = data.union.get()
        if union is None or not union.is_belong_to_target_union(req.union_id):
            res.ret = union_pb2.UNION_NOT_MATCHED
            return self._reset_succeed(data, req, res, timer)

        gold = union_boss_business.get_reset_attack_gold(data)
        if gold != req.gold:
            res.ret = union_pb2.UNION_BOSS_REFRESH_ATTACK_GOLD_ERROR
            return self._reset_succeed(data, req, res, timer)
        
        union.reset_unionboss_attack()

        resource = data.resource.get()
        resource.update_current_resource(timer.now)	
        original_gold = resource.gold
        if not resource.cost_gold(gold):
            res.ret = union_pb2.UNION_BOSS_REFRESH_ATTACK_GOLD_SHORTAGE
            return self._reset_succeed(data, req, res, timer)
        log = log_formater.output_gold(data, -gold, log_formater.UNIONBOSS_RESET,
                "Unionboss reset", before_gold = original_gold)
        logger.notice(log)	

        res.ret = union_pb2.UNION_OK
        defer = DataBase().commit(data)
        defer.addCallback(self._reset_succeed, req, res, timer)
        return defer
Beispiel #18
0
    def _calc_add(self, data, req, timer):
        """强制的添加/减少金钱、粮草、元宝
        """
        resource = data.resource.get()
        resource.update_current_resource(timer.now)
        original_gold = resource.gold

        if req.resource.money > 0:
            resource.gain_money(req.resource.money, True)
        elif req.resource.money < 0:
            resource.cost_money(-req.resource.money)

        if req.resource.food > 0:
            resource.gain_food(req.resource.food, True)
        elif req.resource.food < 0:
            resource.cost_food(-req.resource.food)

        if req.resource.gold > 0:
            resource.gain_gold(req.resource.gold)
            log = log_formater.output_gold(data,
                                           req.resource.gold,
                                           log_formater.OPERATE_GOLD,
                                           "Gain gold frome add",
                                           before_gold=original_gold)
            logger.notice(log)
        elif req.resource.gold < 0:
            resource.cost_gold(-req.resource.gold)
            log = log_formater.output_gold(data,
                                           -req.resource.gold,
                                           log_formater.OPERATE_GOLD,
                                           "Remove gold",
                                           before_gold=original_gold)
            logger.notice(log)

        if req.resource.achievement > 0:
            resource.gain_achievement(req.resource.achievement)
        elif req.resource.achievement < 0:
            resource.cost_achievement(-req.resource.achievement)

        if req.resource.soul > 0:
            resource.gain_soul(req.resource.soul)
        elif req.resource.soul < 0:
            resource.cost_soul(-req.resource.soul)

        return DataBase().commit(data)
Beispiel #19
0
def refresh_goods(data, shops, goods_list, now, refresh_item=None, free=False):
    """刷新酒肆中可以购买的货物
    Args:
        data[UserData]: 用户信息
        shops[list(ShopInfo)]: 酒肆信息
        goods_list[list(GoodsInfo) out]: 可以购买的货物列表
        now[int]: 当前时间戳
        free[bool]: 是否免费刷新
    """
    user = data.user.get(True)
    resource = data.resource.get()
    original_gold = resource.gold
    resource.update_current_resource(now)

    use_refresh_item = False
    if not free and refresh_item != None:
        #耗费商铺代币
        if not refresh_item.is_refresh_item():
            logger.warning("Refresh item is wrong[basic_id=%d]" %
                           refresh_item.basic_id)
            return False
        use_refresh_item = True
        if not refresh_item.use_refresh_item(1):
            raise Exception("Use refresh item failed")

    for shop in shops:
        if not free and use_refresh_item == False:
            #花费元宝
            gold_cost = shop.calc_gold_consume_of_refresh_goods(user.vip_level)
            if gold_cost == -1:
                return False
            if not resource.cost_gold(gold_cost):
                return False

        #刷新货物
        if not _refresh_goods_in_shop(data, shop, goods_list, now, free):
            return False

        if not free and refresh_item is None:
            goods_items_id = []
            goods_items_num = []
            for goods in goods_list:
                goods_items_id.append(goods.item_basic_id)
                goods_items_num.append(goods.item_num)
            log = log_formater.output_gold(data,
                                           -gold_cost,
                                           log_formater.REFRESH_WINESHOP_GOODS,
                                           "Refresh wineshop goods by gold",
                                           before_gold=original_gold,
                                           items_id=goods_items_id,
                                           items_num=goods_items_num)
            logger.notice(log)

    return True
Beispiel #20
0
def upgrade_key_node(data, node, now, use_gold=0):
    """关键节点升级
    1 花费金钱粮草
    2 关键节点升一级
    """
    user = data.user.get(True)
    map = data.map.get()
    resource = data.resource.get()
    original_gold = resource.gold
    resource.update_current_resource(now)

    level_add = max(1, int(math.ceil((user.level - node.level) / 2.0)))

    #钱粮消耗
    money = data_loader.KeyNodeUpgradeBasicInfo_dict[node.level].costMoney
    food = data_loader.KeyNodeUpgradeBasicInfo_dict[node.level].costFood

    #如果金钱/粮草不够,使用元宝兑换
    money_gap = 0
    food_gap = 0
    if resource.money < money:
        money_gap = money - resource.money
    if resource.food < food:
        food_gap = food - resource.food
    cost_gold = resource.gold_exchange_resource(money=money_gap, food=food_gap)
    #if cost_gold != use_gold:
    #    logger.warning("Gold exchange resource failed[try cost gold=%d][real cost gold=%d]" %
    #            (use_gold, cost_gold))
    #    return False

    if not resource.cost_money(money) or not resource.cost_food(food):
        return False

    #更新己方资源信息 -
    map.update_for_own_exploit_amount(node, add=False)

    if not node.upgrade_key_node(user, now, level_add):
        return False

    #更新己方资源信息 +
    map.update_for_own_exploit_amount(node, add=True)

    if cost_gold > 0:
        log = log_formater.output_gold(data,
                                       -cost_gold,
                                       log_formater.UPGRADE_KEYNODE,
                                       "Upgrade keynode by gold",
                                       money=money_gap,
                                       food=food_gap,
                                       before_gold=original_gold)
        logger.notice(log)

    return True
Beispiel #21
0
def _calc_mission(data, mission, now, force):
    """结算已经完成的任务
    1 获得奖励
    2 开启后续任务(如果有后续的话)
    """
    #检查是否结束
    user = data.user.get(True)
    if not force and not mission.is_finish(user.level):
        logger.warning("Mission not finish[basic id=%d]" % (mission.basic_id))
        return False

    reward = data_loader.AllMission_dict[mission.basic_id].reward
    #获得资源
    resource = data.resource.get()
    original_gold = resource.gold
    resource.update_current_resource(now)
    resource.gain_money(reward.money)
    resource.gain_food(reward.food)
    resource.gain_gold(reward.gold)
    log = log_formater.output_gold(data,
                                   reward.gold,
                                   log_formater.MISSION_REWARD_GOLD,
                                   "Gain gold from compelete mission",
                                   before_gold=original_gold)
    logger.notice(log)

    #获得政令
    energy = data.energy.get()
    energy.update_current_energy(now)
    energy.gain_energy(reward.energy)

    #获得战利品
    item_list = mission.get_reward_items()
    if not item_business.gain_item(data, item_list, "mission reward",
                                   log_formater.MISSION_REWARD):
        return False
    for i in range(0, len(item_list)):
        id = ItemInfo.generate_id(data.id, item_list[i][0])
        item = data.item_list.get(id)

    #用户获得经验
    if not user_business.level_upgrade(data, reward.monarchExp, now,
                                       "mission exp",
                                       log_formater.EXP_MISSION):
        return False

    #创建后续任务
    next_mission = mission.create_next()
    if next_mission is not None:
        data.mission_list.add(next_mission)

    return True
Beispiel #22
0
    def _calc_refresh_pray(self, data, req, timer):
        """
        """
        if req.pray_type == PrayInfo.PRAY_ALL:
            #到期自动触发刷新
            pray = data.pray.get()

            if pray.is_able_to_reset(timer.now):
                pray.reset(timer.now)
                logger.debug("reset pray info")
            else:
                pray.calc_next_refresh_time(timer.now)
                logger.warning("calc next pray refresh time")

        else:
            #涉及到跨天的数据统计,所以此处要更新所有跨天数据
            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

            building_level = 0
            #找出寺庙
            for building in data.building_list.get_all(True):
                if building.is_temple():
                    building_level = building.level
                    break
            if building_level == 0:
                raise Exception("Refresh pray failed, no temple")

            original_gold = pray_business.refresh_pray(data, req.pray_type,
                                                       building_level,
                                                       cost_gold, timer.now)[1]
            if not pray_business.refresh_pray(data, req.pray_type,
                                              building_level, cost_gold,
                                              timer.now)[0]:
                raise Exception("Refresh pray failed")

            if cost_gold != 0:
                log = log_formater.output_gold(data,
                                               -cost_gold,
                                               log_formater.REFRESH_PRAY,
                                               "Refresh pray by gold",
                                               before_gold=original_gold,
                                               pray_type=req.pray_type)
                logger.notice(log)

        return DataBase().commit(data)
Beispiel #23
0
def _consume_resources(user_data, box_id, donate_type, timer):
    """根据捐献等级消耗资源"""
    (money, gold) = get_donate_resources_by_boxid(box_id, donate_type)
    resource = user_data.resource.get()

    resource.update_current_resource(timer.now)
    original_gold = resource.gold
    resource.cost_money(money)
    resource.cost_gold(gold)
    log = log_formater.output_gold(user_data,
                                   -gold,
                                   log_formater.CONSUME_RESOURCES,
                                   "Consume resources use gold",
                                   before_gold=original_gold)
    logger.notice(log)
Beispiel #24
0
def clear_coldtime(user_data, gold, timer):
    """清空冷却时间"""
    resource = user_data.resource.get()
    resource.update_current_resource(timer.now)
    original_gold = resource.gold
    assert resource.cost_gold(gold)

    log = log_formater.output_gold(user_data,
                                   -gold,
                                   log_formater.CLEAR_COLDTIME,
                                   "Clear coldtime by gold",
                                   before_gold=original_gold)
    logger.notice(log)

    union = user_data.union.get()
    union.donate_coldtime = timer.now - union.last_donate_time
Beispiel #25
0
def reset_cd(data, now, ret = Ret()):
    gold = int(float(data_loader.OtherBasicInfo_dict['transfer_arena_reset_cd_cost'].value))
    resource = data.resource.get()
    resource.update_current_resource(now)
    original_gold = resource.gold
    if not resource.cost_gold(gold):
        ret.setup("NO_ENOUGH_GOLD")
        return False
    log = log_formater.output_gold(data, -gold, log_formater.RESET_CD,
                "Reset cd by gold", before_gold = original_gold)
    logger.notice(log)

    transfer = data.transfer.get(True)
    transfer.reset_cd(now)

    return True
Beispiel #26
0
def _operate_activity_shop(basic_data, data, activity, op_type, op_input, step_id, now):
    """购买物品
    """
    basic_activity = basic_data.activity_list.get(activity.basic_id)
    step_info = basic_data.activity_step_list.get(step_id)

    resource = data.resource.get()
    original_gold =  resource.gold
    if not resource.cost_gold(step_info.value1):
        return False
    log = log_formater.output_gold(data, -step_info.value1, log_formater.OPERATE_ACTIVITY_SHOP,
                "operate activity shop by gold", before_gold = original_gold)
    logger.notice(log)

    #改变进度
    activity.forward(basic_activity, step_id, 1, now)
    return True
Beispiel #27
0
def buy_attack_times(data, now, ret = Ret()):
    gold = int(float(data_loader.OtherBasicInfo_dict['transfer_arena_challenge_buy_cost'].value))
    resource = data.resource.get()
    resource.update_current_resource(now)
    original_gold = resource.gold
    if not resource.cost_gold(gold):
        ret.setup("NO_ENOUGH_GOLD")
        return False
    log = log_formater.output_gold(data, -gold, log_formater.TRANSFER_ARENA,
                "Transfer arena challenge", before_gold = original_gold)
    logger.notice(log)

    transfer = data.transfer.get(True)
    if not transfer.reduce_attack_num(1, ret):
        return False

    return True
Beispiel #28
0
def create_union(data, union_id, gold, now):
    """创建联盟
    不受联盟锁定时间影响
    消耗元宝
    """
    union = data.union.get()
    union.reset_lock_time(now)
    union.join_union(union_id, now)

    resource = data.resource.get()
    resource.update_current_resource(now)
    original_gold = resource.gold
    assert resource.cost_gold(gold)
    log = log_formater.output_gold(data,
                                   -gold,
                                   log_formater.CREATE_UNION,
                                   "Create union by gold",
                                   before_gold=original_gold)
    logger.notice(log)
Beispiel #29
0
    def _calc_query(self, data, req, timer):
        """查询史实城
        """
        user = data.user.get(True)
        if not user.allow_pvp:
            raise Exception("User pvp locked")

        #获取之前匹配的对手信息
        city_id = LegendCityInfo.generate_id(data.id, req.city_id)
        legendcity = data.legendcity_list.get(city_id)

        #用户花费元宝重新匹配对手
        if req.HasField("rematch_position_level"):
            cost_gold = legendcity.calc_rematch_cost(
                req.rematch_position_level)
            if cost_gold != req.gold:
                raise Exception("Unmatched gold cost[expect=%d][cost=%d]" %
                                (cost_gold, req.gold))
            resource = data.resource.get()
            original_gold = resource.gold
            if not resource.cost_gold(cost_gold):
                raise Exception("Cost gold failed")
            log = log_formater.output_gold(data,
                                           -cost_gold,
                                           log_formater.LEGENDCITY_REMATCH,
                                           "Rematch player by gold",
                                           before_gold=original_gold)
            logger.notice(log)

        unit_req = unit_pb2.UnitQueryLegendCityReq()
        unit_req.user_id = data.id
        unit_req.rematch_position_level = req.rematch_position_level
        for (id, is_robot, position) in legendcity.get_rivals_info():
            unit_req.rivals_id.append(id)
            unit_req.rivals_position_level.append(position)

        #请求 Unit 模块,查询当前的史实城情况
        defer = GlobalObject().remote['unit'].callRemote(
            "query_city_info", legendcity.city_id,
            unit_req.SerializeToString())
        defer.addCallback(self._update_query_info, data, req, timer)
        return defer
Beispiel #30
0
def respond_aid(data, item_basic_id, honor, exp, gold, now):
    """响应援助,进行捐赠
    获得奖励
    """
    union = data.union.get()

    #消耗物品
    item_id = ItemInfo.generate_id(data.id, item_basic_id)
    item = data.item_list.get(item_id)
    consume = item.consume(1)
    if not consume[0]:
        return False
    output_items = []
    output_items.append("[item=")
    output_items.append(utils.join_to_string(list(consume[1])))
    output_items.append("]")
    log = log_formater.output_item(data, "respond aid",
                                   log_formater.RESPOND_AID,
                                   ''.join(output_items))
    logger.notice(log)
    #logger.notice("respond aid %s"%''.join(output_items))
    #获得联盟荣誉
    union.gain_honor(honor)

    #获得主公经验
    if not user_business.level_upgrade(data, exp, now, "exp aid",
                                       log_formater.EXP_AID):
        return False

    #获得元宝奖励
    resource = data.resource.get()
    resource.update_current_resource(now)
    original_gold = resource.gold
    resource.gain_gold(gold)
    log = log_formater.output_gold(data,
                                   gold,
                                   log_formater.RESPOND_AID_REWARD,
                                   "Gain gold from respond aid",
                                   before_gold=original_gold)
    logger.notice(log)

    return True