| #!/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):  | 
|     GameWorld.Log("AddNewMission----%s"%curMissionID, curPlayer.GetID())  | 
|     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  | 
|   |