#!/usr/bin/python  
 | 
# -*- coding: GBK -*-  
 | 
#---------------------------------------------------------------------  
 | 
#  
 | 
#---------------------------------------------------------------------  
 | 
##@package QuestCommon  
 | 
# @todo: ÈÎÎñ¹«Óú¯Êý  
 | 
#  
 | 
# @author: eggxp  
 | 
# @date 2010-4-26  
 | 
# @version 3.1  
 | 
#  
 | 
# @note: ÈÎÎñ¹«¹²º¯ÊýдÕâÀï  
 | 
#---------------------------------------------------------------------  
 | 
# @change: "2015-08-24 14:30" zqx Ôö¼ÓÍê³ÉÖ÷ÏßÈÎÎñ³É¾Í  
 | 
# @change: "2015-08-24 17:30" zqx ·Àimport±¨´í  
 | 
# @change: "2015-08-27 23:30" zqx ÐÞ¸ÄÀϺÅÈÎÎñ³É¾Í´¦ÀíÂß¼,²»ÊdzɾÍÖеÄÈÎÎñ²»×߳ɾÍÂß¼  
 | 
# @change: "2016-07-18 19:00" hxp ÉèÖÃÈÎÎñ״̬ͳһº¯Êý£»Ôö¼Ó½ÓÈÎÎñ¡¢Íê³ÉÈÎÎñʼþ¼Ç¼µã  
 | 
# @change: "2016-09-19 21:30" hxp Ôö¼ÓÅжÏÊÇ·ñÍê³É¶ÔÓ¦Ö÷ÏßÈÎÎñº¯Êý  
 | 
#---------------------------------------------------------------------  
 | 
#"""Version = 2016-09-19 21:30"""  
 | 
#---------------------------------------------------------------------  
 | 
import re  
 | 
import IPY_GameWorld  
 | 
import GameWorld  
 | 
import ChConfig  
 | 
import random  
 | 
import copy  
 | 
import ReadChConfig  
 | 
import DataRecordPack  
 | 
import ShareDefine  
 | 
import EventReport  
 | 
import QuestManager  
 | 
import GameFuncComm  
 | 
import ChPyNetSendPack  
 | 
import NetPackCommon  
 | 
#---------------------------------------------------------------------  
 | 
#ËùÓÐÈÎÎñµÄË÷Òý  
 | 
FindQuestFunc = None  
 | 
# ÓÃÓÚÅж¨ÈÎÎñÊÇ·ñ±»É¾³ý  
 | 
g_IsMissionDeleted = 1  
 | 
  
 | 
#---10-05-27 Alee ½«Ëæ»úÈÎÎñʼþ·ÖÀàÐÍ´¦Àí£¨±ÈÈç֮ǰΪÿÈÕɱ¹ÖµÈ£¬¸ÄΪͳһÈÎÎñ¿ÉÓ㬲¢·Ö¿ª´¦Àí¸÷ʼþ£©  
 | 
#Def_Day_Event_ID = "day_event_id"  
 | 
#Def_Day_Event_Count = "day_event_count"  
 | 
#Def_Day_Event_Cur = "day_event_cur_count"  
 | 
Def_Day_Event_Cur_Complete_Count = "count"  
 | 
Def_Day_Event_Max_Complete_Count = "max_count"   
 | 
Def_Day_Event_Any_Kill = "day_event_any_kill"       #ÈÎÒâɱ¹Ö¶¼¿ÉÒÔ´¥·¢ÈÎÎñ, Í¨³£ÓÃÓÚ¸±±¾  
 | 
Def_Around_Count_In_Mission_1 = "around_count"             #ÉͽðÅÜ»·»·Êý£¨´æÈÎÎñ1£©  
 | 
Def_Around_Star_In_Mission_1 = "around_star"             #ÉͽðÅÜ»·»·ÐÇ£¨´æÈÎÎñ1£©  
 | 
Def_Run_Count_In_Mission_1 = "around_allcount"                #ÉͽðÅÜ»·×Ü»·Êý£¨´æÈÎÎñ1£©  
 | 
Def_Around_Count_Family_In_Mission_1 = "around_count_family"    #¼Ò×åÅÜ»·»·Êý£¨´æÈÎÎñ1£©  
 | 
Def_Around_Star_Family_In_Mission_1 = "around_star_family"      #¼Ò×åÅÜ»·»·ÐÇ£¨´æÈÎÎñ1£©  
 | 
Def_Run_Count_Family_In_Mission_1 = "around_allcount_family"          #¼Ò×åÅÜ»·×Ü»·Êý£¨´æÈÎÎñ1£©  
 | 
  
 | 
Def_Collect_Npc_ID = "collect_npc_id"                    #Ëæ»ú²É¼¯NPC¸ù¾ÝID  
 | 
Def_Collect_Npc_ID_Count = "collect_npc_id_count"        #Ëæ»ú²É¼¯NPC¸ù¾ÝIDµÄ¸öÊý  
 | 
Def_Collect_Npc_ID_Cur = "collect_npc_id_cur_count"      #Ëæ»ú²É¼¯NPC¸ù¾ÝIDµÄµ±Ç°¸öÊý  
 | 
  
 | 
Def_Kill_Npc_ID = "kill_npc_id"                    #Ëæ»úɱËÀNPC¸ù¾ÝID  
 | 
Def_Kill_Npc_ID_Count = "kill_npc_id_count"        #Ëæ»úɱËÀNPC¸ù¾ÝIDµÄ¸öÊý  
 | 
Def_Kill_Npc_ID_Cur = "kill_npc_id_cur_count"      #Ëæ»úɱËÀNPC¸ù¾ÝIDµÄµ±Ç°¸öÊý  
 | 
  
 | 
Def_Kill_Npc_LV = "kill_npc_lv"                    #Ëæ»úɱËÀNPC¸ù¾ÝµÈ¼¶  
 | 
Def_Kill_Npc_LV_Count = "kill_npc_lv_count"        #Ëæ»úɱËÀNPC¸ù¾ÝµÈ¼¶µÄ¸öÊý  
 | 
Def_Kill_Npc_LV_Cur = "kill_npc_lv_cur_count"      #Ëæ»úɱËÀNPC¸ù¾ÝµÈ¼¶µÄµ±Ç°¸öÊý  
 | 
  
 | 
Def_Item_ID = "item_id"                            #Ëæ»ú»ñµÃÎïÆ·¸ù¾ÝID  
 | 
Def_Item_Count = "item_count"                      #Ëæ»ú»ñµÃÎïÆ·¸öÊý    
 | 
Def_Item_Cur = "item_cur_count"                    #µ±Ç°»ñµÃÎïÆ·¸öÊý  
 | 
  
 | 
Def_Visit_Npc_ID = "visit_npc_id"                  #Ëæ»ú·ÃÎÊNPC  
 | 
  
 | 
Def_NewGuyNoSight = "xinshou"   # ÐÂÊÖÆÚÒþÉíÎÞÊÓÒ°  
 | 
  
 | 
#------------ÔDayEventDataÈ¥³ý£¬Ì滻ö¾Ù¹ÜÀí-----------------  
 | 
(  
 | 
Day_KillNPC_By_ID_List,    #Type = Day_KillNPC_By_ID  
 | 
Day_KillNPC_By_LV_List,    #Type = Day_KillNPC_By_LV  
 | 
Day_GetItem_By_ID,         #Type = Day_GetItem_By_ID  
 | 
Day_VisitNPCList,          #Type = Day_VisitNPC  
 | 
Day_MissionList,           #Type = Day_Mission  
 | 
Day_CollectNPCList,           #Type = Day_CollectNPC_By_ID  
 | 
) = range(6)  
 | 
#---------------------------------------------------------------------  
 | 
  
 | 
#0£º¾çÇéÈÎÎñ, Ö÷ÏßÈÎÎñID±ØÐë°´ÈÎÎñ˳ÐòµÝÔö  
 | 
#1£ºÖ§ÏßÈÎÎñ  
 | 
#2£ºÈÕ³£ÈÎÎñ  
 | 
#5£¬6£¬7£ºÊÀ½çÈÎÎñ  
 | 
#22£ºÈÈÃŻ  
 | 
#20£º²»ÏÔʾÃèÊöºÍÏòµ¼  
 | 
#21£ºÎª²»ÏÔʾÏòµ¼  
 | 
#24£ºÕ½ÃËÐüÉÍ  
 | 
#3: ´«È븱±¾  
 | 
#4:ΪÐèµ½¸±±¾ÀïÍê³ÉµÄÈÎÎñ  
 | 
#ÈÎÎñµÈ¼¶Ìî0ʱÔò²»¸ù¾ÝµÈ¼¶É¸Ñ¡¹æÔòÏÔʾ  
 | 
#12: Òþ²ØÖ÷Ïß¾çÇ飬һ°ãÓÃÓÚ¸¨ÖúÖ÷ÏßÈÎÎñÓÃµÄ  
 | 
  
 | 
Def_Mission_Type_Main = 0 # Ö÷Ïß¾çÇé  
 | 
Def_Mission_Type_MainHid = 120 # Òþ²ØÖ÷Ïß¾çÇé  
 | 
Def_GM_Active_Mission_Type = 999 #ÔÝʱ²»Óã¬Åä´óµã  
 | 
Def_Mission_Type_RunDaily = 7  
 | 
Def_Mission_Type_RunFamily = 12  
 | 
  
 | 
Def_MainTask_Type_List = [Def_Mission_Type_Main, Def_Mission_Type_MainHid]  
 | 
Def_RunTask_Type_List = [Def_Mission_Type_RunDaily, Def_Mission_Type_RunFamily]  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
## »ñÈ¡¹«ÓÃÈÎÎñ  
 | 
#  @param curPlayer µ±Ç°Íæ¼Ò  
 | 
#  @return None  
 | 
#  @remarks (Õâ¸öÈÎÎñ¼Ç¼ÁËÒ»Ð©Íæ¼ÒÊý¾Ý)  
 | 
def GetCommonMission(curPlayer):  
 | 
    #ÅжÏÓÐûÓÐÈÎÎñ1  
 | 
    curMission = curPlayer.FindMission(ChConfig.Def_MissionID_FirstLogin)  
 | 
  
 | 
    return curMission  
 | 
#---------------------------------------------------------------------  
 | 
##ÉèÖú¯Êý, ²éÕÒÈÎÎñ  
 | 
# @param questIndex ÈÎÎñË÷Òý  
 | 
# @return ·µ»ØÖµÎÞÒâÒå  
 | 
# @remarks ÉèÖú¯Êý, ²éÕÒÈÎÎñ  
 | 
def SetFindQuestFunc(questIndex):  
 | 
    global FindQuestFunc  
 | 
    FindQuestFunc = questIndex  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
##¹ýÂË×Ö·û´®  
 | 
# @param str Ô×Ö·û  
 | 
# @param mark ¹ýÂËÌõ¼þ  
 | 
# @return ·µ»ØÖµ, ¹ýÂ˺óµÄ×Ö·û´®  
 | 
# @remarks ¹ýÂË×Ö·û´®  
 | 
def DealWithInPut(str, mark = '?'):  
 | 
    return re.findall("\(\\%s(\w+)\\%s\)"%(mark, mark), str)  
 | 
#    var=[]  
 | 
#    r=re.compile(r"[\(][%s][^\(]*[%s][\)]"%(mark, mark))  
 | 
#    strList=r.findall(str)  
 | 
#    rs=re.compile(r"[^\(%s][^\(]*[^%s\)]"%(mark, mark))  
 | 
#    for i in range(len(strList)):  
 | 
#        curItem=rs.findall(strList[i])  
 | 
#        var.extend(curItem)  
 | 
#    return var  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
##¹ýÂË×Ö·û´®  
 | 
# @param str Ô×Ö·û  
 | 
# @param rstr Ìæ»»µÄ×Ö·û´®  
 | 
# @param mark ¹ýÂËÌõ¼þ  
 | 
# @return ·µ»ØÖµ, ¹ýÂ˺óµÄ×Ö·û´®  
 | 
# @remarks ¹ýÂË×Ö·û´®  
 | 
def DealWithReverse(str, rstr, mark = '?'):  
 | 
    r=re.compile(r"[\(][%s][^\(]*[%s][\)]"%(mark, mark))  
 | 
    strList=r.findall(str)  
 | 
    replaceStr=str  
 | 
    for j in range(len(strList)):  
 | 
        if len(rstr)!=len(strList):  
 | 
            raise "Out Of Index Exception"  
 | 
        replaceStr=replaceStr.replace(strList[j],rstr[j])  
 | 
    return replaceStr      
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
##ÉèÖ÷þÎñÆ÷ÈÎÎñ״̬stateºÍ֪ͨ¿Í»§¶ËµÄÈÎÎñ״̬MissionStat  
 | 
# @param curPlayer Íæ¼ÒʵÀý  
 | 
# @param curMission ÈÎÎñʵÀý  
 | 
# @param state ÉèÖõÄ״̬  
 | 
# @return ·µ»ØÖµÎÞÒâÒå  
 | 
# @remarks ÉèÖ÷þÎñÆ÷ÈÎÎñ״̬stateºÍ֪ͨ¿Í»§¶ËµÄÈÎÎñ״̬MissionStat  
 | 
def SetPlayerMissionState(curPlayer, curMission, state, isFinish=1, failReason=""):  
 | 
    #curState = curMission.GetState()  
 | 
    #if curState == -1:  
 | 
    #²»ÄÜÔÚÕâÀïÉèÖÃDescriptionIndex, ÒòΪÔÚ·â¾ôµÄʱºò, ÏÈÉèÖÃ-1, ÔÙ¸ø½±Àø  
 | 
      
 | 
    #2009.1.21  
 | 
    #ÔÀ´ÊÇÖ»ÓÐ-1״̬, ²ÅÉèÖÃMissionStateºÍDescriptionIndex  
 | 
    #ÏÖÔÚ¸ÄΪËùÓж¼ÕâÑù  ------> ÓÉÓÚÈÎÎñ2000004,ÈÎÎñ״̬²»Îª-1µÄʱºòÒªÇå³ýÈÎÎñ¶ø¸Ä  
 | 
    #¿É½Ó  
 | 
    if state == ChConfig.Def_Mission_State_NoAccept:  
 | 
        curMission.SetMissionState(IPY_GameWorld.msNoMission)  
 | 
        curMission.SetDescriptionIndex(0)  
 | 
    #¿É½»  
 | 
    elif state == ChConfig.Def_Mission_State_CanComplete:  
 | 
        curMission.SetMissionState(IPY_GameWorld.msCanComplete)  
 | 
    #²»ÊÇÍê³É  
 | 
    elif state != ChConfig.Def_Mission_State_Over:  
 | 
        curMission.SetMissionState(IPY_GameWorld.msProcessing)  
 | 
          
 | 
    curMission.SetState(state)  
 | 
      
 | 
    missionID = curMission.GetMissionID()  
 | 
    curQuestData = QuestManager.FindQuest(missionID)  
 | 
      
 | 
    # ïÚ³µ »·ÈÎÎñÌØÊâ´¦Àí, »·ÈÎÎñÖÐÖ»×öÈÎÎñËæ»ú£¬½øÐÐ״̬¸Ä±ä  
 | 
#    if curQuestData != None and state == 1 and (curQuestData.Type in Def_RunTask_Type_List or missionID == ChConfig.Def_ConvoyTruckMissionID):  
 | 
#        EventReport.WriteEvent_mission_log(curPlayer, curQuestData, 0)  
 | 
#          
 | 
      
 | 
    if state == ChConfig.Def_Mission_State_Over:  
 | 
        # ³É¾Í  
 | 
        import PlayerSuccess  
 | 
        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_MainTaskNode, 1, [missionID])  
 | 
          
 | 
        # ¾çÇéÈÎÎñÍê³É´¦Àí  
 | 
        OnStoryMissionFinish(curPlayer, missionID)  
 | 
          
 | 
        # Íê³ÉÈÎÎñʼþ  
 | 
        GameFuncComm.DoFuncOpenLogic(curPlayer, [missionID])  
 | 
        EventReport.WriteEvent_mission_log(curPlayer, curQuestData, 1, isFinish, failReason)  
 | 
      
 | 
    # ïÚ³µÍê³ÉÌØÊâ´¦Àí  
 | 
    elif missionID == ChConfig.Def_ConvoyTruckMissionID and state == ChConfig.Def_Mission_State_NoAccept:  
 | 
        GameFuncComm.DoFuncOpenLogic(curPlayer, [missionID])  
 | 
        EventReport.WriteEvent_mission_log(curPlayer, curQuestData, 1, isFinish, failReason)  
 | 
          
 | 
    return  
 | 
  
 | 
def OnStoryMissionFinish(curPlayer, missionID):  
 | 
    ''' ¾çÇéÈÎÎñÍê³É״̬´¦Àí  
 | 
    1¿ªÍ·´ú±í¾çÇéÈÎÎñ   
 | 
    1 µØÍ¼±àºÅxx ¾çÇé±àºÅxx ÈÎÎñ±àºÅxx ÊÇ·ñ±¾¾çÇé×îºóÒ»¸öÈÎÎñ  
 | 
    1 xx xx xx 0  
 | 
        ...  
 | 
    1 xx xx xx 1  
 | 
    '''  
 | 
    missionIDStr = str(missionID)  
 | 
    if len(missionIDStr) != 8 or not missionIDStr.startswith("1"):  
 | 
        #GameWorld.DebugLog("·Ç¾çÇéÈÎÎñID£¬²»´¦Àí£¡missionID=%s" % missionID)  
 | 
        return  
 | 
      
 | 
    storyNum = int(missionIDStr[3:5])  
 | 
    isFinish = missionID % 10  
 | 
    if isFinish not in [0, 1]:  
 | 
        GameWorld.ErrLog("Íê³ÉµÄ¾çÇéÈÎÎñID´íÎ󣡱ØÐëÊÇ0»ò1½áβ£¡missionID=%s" % (missionID), curPlayer.GetPlayerID())  
 | 
        return  
 | 
      
 | 
    if not isFinish:  
 | 
        #GameWorld.DebugLog("¸Ã¾çÇéÈÎÎñδȫ²¿Íê³É£¬²»´¦Àí£¡missionID=%s,storyNum=%s" % (missionID, storyNum))  
 | 
        return  
 | 
      
 | 
    dictValue, updDictValue = GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_StoryMissionState, storyNum, 1)  
 | 
    Sync_StoryMissionState(curPlayer, [storyNum])  
 | 
    GameWorld.Log("¾çÇéËùÓÐÈÎÎñÍê³É: missionID=%s,¾çÇé±àºÅ=%s,dictValue=%s,updDictValue=%s"   
 | 
                  % (missionID, storyNum, dictValue, updDictValue), curPlayer.GetPlayerID())  
 | 
    return  
 | 
  
 | 
def Sync_StoryMissionState(curPlayer, storyNumList=[]):  
 | 
    isSyncAllState = True  
 | 
    if not storyNumList:  
 | 
        storyNumList = xrange(ChConfig.Max_StoryMissionNum + 1)  
 | 
        isSyncAllState = False  
 | 
          
 | 
    stateInfo = ChPyNetSendPack.tagMCStoryMissionStateInfo()  
 | 
    stateInfo.StoryMissionStateList = []  
 | 
    for storyNum in storyNumList:  
 | 
        isAllFinish = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_StoryMissionState, storyNum)  
 | 
        if not isSyncAllState and not isAllFinish:  
 | 
            continue  
 | 
        storyState = ChPyNetSendPack.tagMCStoryMissionState()  
 | 
        storyState.StoryNum = storyNum  
 | 
        storyState.IsAllFinish = isAllFinish  
 | 
        stateInfo.StoryMissionStateList.append(storyState)  
 | 
    stateInfo.Count = len(stateInfo.StoryMissionStateList)  
 | 
    if stateInfo.Count:  
 | 
        NetPackCommon.SendFakePack(curPlayer, stateInfo)  
 | 
    return  
 | 
#---------------------------------------------------------------------  
 | 
##»ñµÃÈÎÎñ½±Àø½Úµã  
 | 
# @param curPlayer Íæ¼ÒʵÀý  
 | 
# @param curMission ÈÎÎñʵÀý  
 | 
# @return ·µ»ØÖµ, ½±Àø½ÚµãÐÅÏ¢  
 | 
# @remarks »ñµÃÈÎÎñ½±Àø½Úµã  
 | 
def GetRewardNode(curPlayer, curMission):  
 | 
    if FindQuestFunc(curMission.GetMissionID()) == None:  
 | 
        return None  
 | 
      
 | 
    descriptIndex = curMission.GetDescriptionIndex()  
 | 
      
 | 
    questList = FindQuestFunc(curMission.GetMissionID()).QuestDescriptionList  
 | 
    if descriptIndex >= len(questList) or descriptIndex < 0:  
 | 
        return None  
 | 
      
 | 
    xmlNode = questList[descriptIndex].Rewards  
 | 
    if xmlNode == None or xmlNode.IsEmpty():  
 | 
        return None  
 | 
      
 | 
    for i in range(xmlNode.GetChildCount()):  
 | 
        curRewardNode = xmlNode.GetChild(i)  
 | 
        #ÅжÏÕâ¸ö½±ÀøÊDz»ÊǸøÕâ¸öÈ赀  
 | 
        rewardType = curRewardNode.GetAttribute("type")  
 | 
        rewardType2 = curRewardNode.GetAttribute("type2")  
 | 
        if rewardType == "":  
 | 
            return  curRewardNode  
 | 
          
 | 
        rewardValue = int(curRewardNode.GetAttribute("value"))  
 | 
          
 | 
        rewardType = rewardType.title()  
 | 
        if rewardType2 != "":  
 | 
            rewardType2 = rewardType2.title()  
 | 
            rewardValue2 = int(curRewardNode.GetAttribute("value2"))  
 | 
            #ÐÔ±ðºÍÖ°Òµ  
 | 
            if rewardType == "Job" and rewardValue == curPlayer.GetJob() and rewardType2 == "Sex" and rewardValue2 == curPlayer.GetSex():  
 | 
                return curRewardNode  
 | 
        else:  
 | 
            #ÐÔ±ð  
 | 
            if rewardType == "Sex" and rewardValue == curPlayer.GetSex():  
 | 
                return curRewardNode  
 | 
            #Ö°Òµ  
 | 
            elif rewardType == "Job" and rewardValue == curPlayer.GetJob():  
 | 
                return curRewardNode  
 | 
            else:  
 | 
                GameWorld.Log("ÈÎÎñID = %d, ½±ÀøÀàÐÍ : %s Î´´¦Àí  : (%d,%d)"%(curMission.GetMissionID(), rewardType, curPlayer.GetSex(), curPlayer.GetJob()) , curPlayer.GetPlayerID())  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
##»ñÈ¡ÈÎÎñID  
 | 
# @param mission ÈÎÎñʵÀý  
 | 
# @return ÈÎÎñID  
 | 
# @remarks »ñÈ¡ÈÎÎñID  
 | 
def GetMissionID(curMission):  
 | 
    if curMission == None:  
 | 
        return 0  
 | 
      
 | 
    return curMission.GetMissionID()  
 | 
  
 | 
  
 | 
##Ìí¼ÓÐÂÈÎÎñ  
 | 
# @param curPlayer Íæ¼ÒʵÀý  
 | 
# @param curMissionID ÈÎÎñID  
 | 
# @return ·µ»ØÖµ,ÐÂÔöµÄÈÎÎñʵÀý  
 | 
# @remarks Ìí¼ÓÐÂÈÎÎñ  
 | 
def AddNewMission(curPlayer, curMissionID):  
 | 
    curMission = curPlayer.AddMission(curMissionID)  
 | 
  
 | 
    #µÈ¼¶´¥·¢OSS¼Ç¼  
 | 
    if GameWorld.IsMissonDR(curPlayer):  
 | 
        DataRecordPack.DR_AddNewMission(curPlayer, curMissionID)  
 | 
          
 | 
    # ¼Ç¼ÈÎÎñ¿ªÊ¼Ê¼þ  
 | 
    curQuestData = QuestManager.FindQuest(curMissionID)  
 | 
    if curQuestData != None:  
 | 
        EventReport.WriteEvent_mission_log(curPlayer, curQuestData, 0)  
 | 
    return curMission  
 | 
  
 | 
#---------------------------------------------------------------------  
 | 
##ɾ³ýÈÎÎñ  
 | 
# @param curPlayer Íæ¼ÒʵÀý  
 | 
# @param curMissionID ÈÎÎñID  
 | 
# @return ·µ»ØÖµ,ÎÞÒâÒå  
 | 
# @remarks É¾³ýÈÎÎñ  
 | 
def DeleteMission(curPlayer, curMissionID):  
 | 
    if not curPlayer.FindMission(curMissionID):  
 | 
        GameWorld.ErrLog("Óûɾ³ýÒ»¸ö²»´æÔÚµÄÈÎÎñ %s"%(curMissionID))  
 | 
        return  
 | 
      
 | 
    global g_IsMissionDeleted  
 | 
    g_IsMissionDeleted = 1  
 | 
      
 | 
    curPlayer.DelMission(curMissionID)  
 | 
  
 | 
    #µÈ¼¶´¥·¢OSS¼Ç¼  
 | 
    if GameWorld.IsMissonDR(curPlayer):  
 | 
        DataRecordPack.DR_DeleteMission(curPlayer, curMissionID)  
 | 
    return  
 | 
  
 | 
def GetHadFinishMainMission(curPlayer, missionID):  
 | 
    ''' ¼ì²éÊÇ·ñÒѾÍê³É¸ÃÖ÷ÏßÈÎÎñ '''  
 | 
      
 | 
    curMission = curPlayer.FindMission(missionID)  
 | 
    if curMission != None:  
 | 
        #GameWorld.DebugLog("µ±Ç°ÈÎÎñδÍê³É...missionID=%s" % missionID)  
 | 
        return curMission.GetState() == ChConfig.Def_Mission_State_Over  
 | 
      
 | 
    curMissionData = FindQuestFunc(missionID)  
 | 
    if not curMissionData:  
 | 
        return False  
 | 
      
 | 
    # ·ÇÖ÷Ïß²»ÅÐ¶Ï  
 | 
    if curMissionData.Type not in Def_MainTask_Type_List:  
 | 
        #GameWorld.DebugLog("·ÇÖ÷Ïß²»ÅжÏ...missionID=%s" % missionID)  
 | 
        return False  
 | 
      
 | 
    # ²»´æÔÚ¸ÃÈÎÎñ£¬ÔòÅжÏͬÀàÐ͵ÄÈÎÎñID  
 | 
    for i in range(curPlayer.GetMissionCount()):  
 | 
        mission = curPlayer.GetMissionByIndex(i)  
 | 
        taskID = mission.GetMissionID()  
 | 
        missionData = FindQuestFunc(taskID)  
 | 
        if not missionData:  
 | 
            continue  
 | 
          
 | 
        taskType = missionData.Type  
 | 
        if taskType not in Def_MainTask_Type_List:  
 | 
            continue  
 | 
          
 | 
        # ÓÉÓÚÖ÷ÏßÈÎÎñIDÊǰ´ÈÎÎñ˳ÐòµÝÔöµÄ£¬¹ÊÖ»Òª´æÔÚ´óÓÚ¸ÃÈÎÎñIDµÄÖ÷ÏßÈÎÎñÔò´ú±í¸ÃÖ÷ÏßÈÎÎñÒÑÍê³É  
 | 
        if taskID > missionID:  
 | 
            #GameWorld.DebugLog("´æÔÚÖ÷ÏßÈÎÎñ %s > missionID=%s" % (taskID, missionID))  
 | 
            return True  
 | 
          
 | 
    #GameWorld.DebugLog("¸ÃÖ÷ÏßÈÎÎñδÍê³É...missionID=%s" % missionID)  
 | 
    return False  
 | 
  
 | 
##ÈÎÎñÊÇ·ñ±»É¾³ý  
 | 
# @param None  
 | 
# @return ²¼¶û  
 | 
def IsDeleteMission():  
 | 
    return g_IsMissionDeleted  
 | 
  
 | 
##ÉèÖÃÈÎÎñɾ³ý״̬  
 | 
# @param state BOOL±êʶɾ³ý  
 | 
# @return None   
 | 
def SetMissionBeDeleted(state):  
 | 
    global g_IsMissionDeleted  
 | 
    g_IsMissionDeleted = state  
 | 
  
 | 
  
 | 
## ¼ì²éÖ÷ÏßÈÎÎñ½áµãÍê³ÉÇé¿ö  
 | 
#  @param curPlayer  
 | 
#  @param succInfoDict ³É¾ÍÐÅÏ¢  
 | 
#  @return ×îºóÍê³ÉµÄÈÎÎñID  
 | 
def GetCurMainTaskState(curPlayer, succInfoDict):  
 | 
    mainTaskIDList = ReadChConfig.GetEvalChConfig("MainTaskIDList")  
 | 
    # »ñÈ¡µ±Ç°Ö÷ÏßÈÎÎñID  
 | 
    curMainMissionID = -1  
 | 
    for i in range(0, curPlayer.GetMissionCount()):  
 | 
        curMission = curPlayer.GetMissionByIndex(i)  
 | 
        missionID = curMission.GetMissionID()  
 | 
        if missionID in mainTaskIDList:  
 | 
            curMainMissionID = missionID  
 | 
          
 | 
    indexList = succInfoDict.keys()  
 | 
    indexList.sort(reverse=True)  
 | 
    # »ñÈ¡²»µ½Ö÷ÏßÈÎÎñʱ  
 | 
    if curMainMissionID < 0:  
 | 
        defaultFinishLV = ReadChConfig.GetEvalChConfig("DefaultFinishLV")  
 | 
        if curPlayer.GetLV() >= defaultFinishLV:  
 | 
            return succInfoDict[indexList[0]].condition  
 | 
        else:  
 | 
            return -1  
 | 
      
 | 
    # »ñÈ¡×îºóÍê³ÉµÄ³É¾ÍÈÎÎñË÷Òý  
 | 
    curMainIndex = mainTaskIDList.index(curMainMissionID)  
 | 
    for index in indexList:  
 | 
        succData = succInfoDict.get(index)  
 | 
        missionID = succData.condition  
 | 
        if missionID not in mainTaskIDList:  
 | 
            GameWorld.DebugLog('¼ì²éÖ÷ÏßÈÎÎñ½áµãÍê³ÉÇé¿ö MainTaskIDList±í©ÅäÁË missionID=%d'%missionID)  
 | 
            continue  
 | 
          
 | 
        mainIndex = mainTaskIDList.index(missionID)  
 | 
        if mainIndex == curMainIndex:  
 | 
            curMission = curPlayer.FindMission(missionID)  
 | 
            if curMission != None:  
 | 
                missionState = curMission.GetState()  
 | 
                if missionState != ChConfig.Def_Mission_State_Over:  
 | 
                    condition = succInfoDict[index -1].condition if index > 0 else -1  
 | 
                    return condition  
 | 
            return succInfoDict[index].condition  
 | 
        if mainIndex < curMainIndex:  
 | 
            return succInfoDict[index].condition  
 | 
    return -1  
 | 
  
 |