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)
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
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
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
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)
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
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)
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
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)
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
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)
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
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
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)
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
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
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
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)
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
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
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
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)
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)
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
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
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
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
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)
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
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