Beispiel #1
0
def use_monarch_exp(data, item, num, now):
    """使用主公经验丹,提升用户经验,可能会升级
    """
    exp = item.use_monarch_exp_item(num)
    if exp is None:
        return False

    return user_business.level_upgrade(data, exp, now, "monarch exp",
                                       log_formater.EXP_MONARCH)
Beispiel #2
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 #3
0
def win_battle(data, enemy_soldier_info, own_soldier_info, score, now):
    """战斗胜利
    """
    user = data.user.get(True)
    union = data.union.get()
    node_id = NodeInfo.generate_id(data.id,
                                   union.get_battle_mapping_node_basic_id())
    battle = data.battle_list.get(node_id)
    rival = data.rival_list.get(node_id)

    #获得战利品
    resource = data.resource.get()
    resource.update_current_resource(now)
    resource.gain_money(battle.reward_money)
    resource.gain_food(battle.reward_food)
    if not item_business.gain_item(data, battle.get_reward_items(),
                                   "win battle", log_formater.WIN_BATTLE):
        return False

    #根据杀敌,增加战功
    _gain_union_battle_individual_score_of_battle(union, enemy_soldier_info,
                                                  score)

    #返还己方存活士兵
    if not battle_business._reclaim_soldier(data, battle, now,
                                            own_soldier_info):
        return False

    #用户获得经验
    if not user_business.level_upgrade(data, battle.reward_user_exp, now,
                                       "exp win union battle",
                                       log_formater.EXP_WIN_BATTLE):
        return False

    #参战英雄获得经验
    heroes_id = battle.get_battle_hero()
    exp = int(battle.reward_hero_exp / len(heroes_id))
    for hero_id in heroes_id:
        hero = data.hero_list.get(hero_id)
        if not hero_business.level_upgrade(data, hero, exp, now):
            return False

    #更新统计信息
    if not battle_business._update_statistics(data, battle, True, rival, None,
                                              enemy_soldier_info,
                                              own_soldier_info):
        return False

    #清除原有的敌人信息
    rival.clear()

    return battle.finish()
Beispiel #4
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
Beispiel #5
0
def _calc_build_exp(data, building, user, heroes, now):
    """参与升级,英雄可以获得的经验,用户(主公)也可以获得经验
    在建升级完成之后,经验才会结算
    Args:
        building[BuildingInfo out]: 建筑信息
        user[UserInfo]: 用户(主公)信息
        heroes[list(HeroInfo) out]: 英雄信息列表
        now[int]: 当前时间戳
    Returns:
        True 计算成功
        False 计算失败
    """
    #用户得到经验
    base_exp = int(
        float(data_loader.OtherBasicInfo_dict["BuildingMonarchGetExp"].value))
    user_exp = (int(user.level / 10) + 1) * base_exp
    if not user_business.level_upgrade(data, user_exp, now, "building exp",
                                       log_formater.EXP_BUILDING):
        logger.warning("User upgrade failed")
        return False

    #英雄经验
    #如果使用『立即完成』,英雄也只会获得到到当前时间为止的经验
    end_time = min(building.upgrade_start_time + building.upgrade_consume_time,
                   now)
    exp_per_hour = data_loader.MonarchLevelBasicInfo_dict[
        user.level].buildExpPerHour
    for hero in heroes:
        if hero is None:
            continue
        if not hero_business.level_upgrade_by_working(data, hero, exp_per_hour,
                                                      end_time, now):
            logger.warning("Hero upgrade failed[hero basic id=%d]" %
                           hero.basic_id)
            return False

    return True
Beispiel #6
0
def trigger_specified_event(data, event_type, now,
        change_nodes = [], new_items = [], new_mails = []):
    """触发指定事件
    """
    user = data.user.get(True)
    ##检查当前玩家等级
    #need_level = int(float(
    #    data_loader.LuckyEventConfInfo_dict["lucky_event_unlock_level"].value))
    #if user.level < need_level:
    #    logger.debug("User level not statisfy, not trigger lucky event[level=%d]" % user.level)
    #    return True

    #判断是否有足够政令值触发指定事件
    energy = data.energy.get()
    need_energy = energy.calc_energy_consume_of_event(event_type)
    if need_energy is None:
        logger.warning("Not able to calc energy consume[type=%d]" % event_type)
        return False

    energy.update_current_energy(now)
    if need_energy > energy.energy:
        logger.warning("Not enough energy to trigger event[type=%d][need_energy=%d][energy=%d]" %
                (event_type, need_energy, energy.energy))
        return False

    #扣减政力值
    if not energy.cost_energy(need_energy, event_type, now):
        return False

    #用户获得经验(1点政力值获得1点主公经验)
    monarch_per_energy = 1
    if data_loader.OtherBasicInfo_dict.has_key("monarch_per_energy"):
        monarch_per_energy = int(float(data_loader.OtherBasicInfo_dict["monarch_per_energy"].value))
    if not user_business.level_upgrade(data, need_energy * monarch_per_energy, now, "event exp", log_formater.EXP_EVENT):
        return False

    logger.debug("Trigger specified event")

    node_list = _get_nodes_can_arise_specified_event(data, event_type, now)
    if len(node_list) == 0:
        logger.debug("No node to trigger specified event[type=%d]" % event_type)
        return True

    trigger_nodes = []

    if (event_type == NodeInfo.EVENT_TYPE_VISIT
            or event_type == NodeInfo.EVENT_TYPE_DUNGEON
            or event_type == NodeInfo.EVENT_TYPE_SEARCH
            or event_type == NodeInfo.EVENT_TYPE_DEEP_MINING
            or event_type == NodeInfo.EVENT_TYPE_HERMIT):
        #visit事件、dungeon事件和离线开采事件,随机选一个点
        index = random.randint(0, len(node_list) - 1)
        trigger_nodes.append(node_list[index])
    else:
        limit_min = _get_event_trigger_limit_min(event_type, user)
        enemy_neighbor_count = 0
        if event_type == NodeInfo.EVENT_TYPE_SCOUT:
            enemy_neighbor_count = _get_all_enemy_neighbor_count(data)

        for node in node_list:
            if _is_node_arise_specified_event(data, node, event_type, now, enemy_neighbor_count):
                trigger_nodes.append(node)

        #保证最少触发limit_min个点
        if len(trigger_nodes) < limit_min:
            diff = limit_min - len(trigger_nodes)
            diff = min(diff, len(node_list) - len(trigger_nodes))
            left_nodes = [ node for node in node_list if node not in trigger_nodes ]
            trigger_nodes.extend(random.sample(left_nodes, diff))

    for node in trigger_nodes:
        change_nodes.append(node)
        if not _node_arise_event(data, node.id, event_type, now,
                change_nodes, new_items, new_mails):
            return False

    logger.debug("trigger specified event[basic id=%d][event type=%d][nodes_num=%d]" %
            (node.basic_id, node.event_type, len(trigger_nodes)))
    return True
Beispiel #7
0
def win_battle(data, node, enemy_soldier_info, own_soldier_info,
        change_nodes, now, new_arena_records = [], 
        is_legendcity = False, is_unionboss = False, is_plunder = False):
    """战斗胜利
    1 获得战利品
    2 获得经验:用户经验,英雄经验
    3 返还存活士兵
    4 更新统计信息
    5 结算节点影响
    Args:
        change_nodes[list(NodeInfo) out]: 发生变化的节点列表
    """
    if node == None:
        #通过邮件复仇、试炼场,不存在node
        node_id = NodeInfo.generate_id(data.id, 0)     #0表示主城
    else:
        node_id = node.id

    battle = data.battle_list.get(node_id)
    if battle is None:
        logger.warning("Battle is not exist[battle node id=%d]" % node_id)
        return False

    node = data.node_list.get(node_id)
    rival = data.rival_list.get(battle.rival_id)

    force = False
    #如果dependence节点所在key node已不可见,强制结束战斗
    if node is not None and node.is_dependency():
        parent_basic_id = MapGraph().get_parent(node.basic_id)
        parent_id = NodeInfo.generate_id(data.id, parent_basic_id)
        parent = data.node_list.get(parent_id, True)
        if not parent.is_visible() or not parent.is_own_side():
            force = True
    if not battle.is_able_to_finish(now, force):
        logger.warning("Not able to finish battle[battle node id=%d][battle rival id=%d]" %
                (battle.node_id, battle.rival_id))
        return False

    #获得战利品
    resource = data.resource.get()
    resource.update_current_resource(now)
    resource.gain_money(battle.reward_money)
    resource.gain_food(battle.reward_food)
    if not item_business.gain_item(data, battle.get_reward_items(), "win battle", log_formater.WIN_BATTLE):
        return False

    if not rival.is_melee_player():
        #返还己方存活士兵
        if not _reclaim_soldier(data, battle, now, own_soldier_info):
            return False

    #用户获得经验,扣除政令
    if 'is_battle_cost_energy' in account_business.get_flags():
        energy = data.energy.get()
        energy.update_current_energy(now)
        if not energy.cost_energy(battle.reward_user_exp, None, now):
            return False

        if not user_business.level_upgrade(data, battle.reward_user_exp, now, "exp win battle", log_formater.EXP_WIN_BATTLE):
            return False

    #参战英雄获得经验
    heroes_id = battle.get_battle_hero()
    exp = int(battle.reward_hero_exp / len(heroes_id)) if len(heroes_id) > 0 else 0
    for hero_id in heroes_id:
        hero = data.hero_list.get(hero_id)
        if not hero_business.level_upgrade(data, hero, exp, now):
            return False

    #更新统计信息
    if not _update_statistics(data, battle, True, rival, node,
            enemy_soldier_info, own_soldier_info):
        return False

    #如果是复仇成功,更新邮件
    mail_id = battle.mail_id
    if mail_id != 0:
        mail = data.mail_list.get(mail_id)
        if not mail_business.use_mail_to_revenge_succeed(data, mail, now):
            return False
        rival.clear()

    #如果是演武场的对手
    if rival.is_arena_player():
        arena = data.arena.get()
        record = arena_business.calc_arena_battle_finish(data, arena, True, rival)
        new_arena_records.append(record)
        rival.clear()

    #如果是乱斗场的对手
    if rival.is_melee_player():
        melee = data.melee.get()
        record = melee_business.calc_melee_battle_finish(data, melee, True, rival)
        new_arena_records.append(record)
        rival.clear()

    #如果是试炼场
    if rival.is_anneal_rival():
        rival.clear()

    #如果是世界boss
    if rival.is_worldboss_rival():
        rival.clear()

    if (not is_legendcity and not is_unionboss and not is_plunder and
            node.event_type not in (
                NodeInfo.EVENT_TYPE_EXPAND_DUNGEON,
                NodeInfo.EVENT_TYPE_ARENA,
                NodeInfo.EVENT_TYPE_WORLDBOSS) and
            node.basic_id != 0 and
            not _update_node_of_win_battle(data, node, now, change_nodes)):
        logger.warning("Update node of win battle failed")
        return False

    #取消战斗状态
    if node is not None:
        node.clear_in_battle()

    return battle.finish()