#!/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 import EventShell #--------------------------------------------------------------------- #ËùÓÐÈÎÎñµÄË÷Òý 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" # ÐÂÊÖÆÚÒþÉíÎÞÊÓÒ° Def_Mission_Grade = "grade" # ÈÎÎñÆÀ¼¶ #------------Ô­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 = 998 # Òþ²ØÖ÷Ïß¾çÇé ÔÝʱ²»Óã¬Åä´óµã 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) 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) EventShell.RunQuestEvent(curPlayer, "on_create", curMissionID, EventShell.Def_RunQuestType_Normal) 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