#!/usr/bin/python # -*- coding: GBK -*- ##@package GenerateClientTable.py # Ä£¿éµÄ¼òҪ˵Ã÷:¿Í»§¶ËÈÎÎñ±í¹¤¾ß # @author:Alee # @date 2010-4-20 ÏÂÎç04:05:50 # @version 1.0 # # ÐÞ¸Äʱ¼ä ÐÞ¸ÄÈË ÐÞ¸ÄÄÚÈÝ # VER = "2010-01-25 15:18" Alee ´´½¨±¾py # # Ä£¿éÏêϸ˵Ã÷:Éú³ÉÒ»ÕÅÓÃÓÚÏÔʾ¿Í»§¶ËÈÎÎñÃèÊöËùÐèÐÅÏ¢µÄ±í£¨PyTask.txt£© # #--------------------------------------------------------------------- #µ¼Èë import ConfigParser import sys import os CParser = ConfigParser.ConfigParser() CParser.readfp(open('TaskManager.ini')) ToolRootPath = os.path.dirname(os.getcwd()) # ¹¤¾ß¸ù·¾¶ ScriptPath = os.getcwd() # ¹¤¾ß½Å±¾Â·¾¶ sys.path.append(ScriptPath + "\PythonLib\lib") import IPY_XMLLoader import CommFunc import Log4P Log4P.SetDebug(CParser.getint('TaskManager', 'Debug')) QUESTDATAPath = ToolRootPath + CParser.get('TaskManager', 'QUESTDATAPath') TASKTABLEPATH = ToolRootPath + CParser.get('TaskManager', 'TASKTABLEPATH') # PyTask.txt µ¼³ö·¾¶ PyTaskHead = ToolRootPath + CParser.get('TaskManager', 'ReadDataPath') + "\PyTaskHead.txt" # PyTask.txt ±íÍ· ClientConfigPath = CParser.get('TaskManager', 'ClientConfigPath') g_GuideDict = {} #ÈÎÎñÏòµ¼×Öµä ## È«¾Öº¯Êý¼òҪ˵Ã÷£º×Ö·û´®Á¬½Ó # @param snake Ô­×Ö·û´® # @param toStr ¿Éת»»Îª×Ö·û´®µÄ¶ÔÏó # @return Á¬½ÓºóµÄ×Ö·û´® # @remarks º¯ÊýÏêϸ˵Ã÷£ºÁ¬½Ó×Ö·û´®£¬\t¸ô¿ª ´«ËµÖеÄ̰³ÔÉß def Snake(snake, toStr): if snake == '': snake += str(toStr) else: snake += '\t' + str(toStr) return snake ## È«¾Öº¯Êý¼òҪ˵Ã÷£ºÈÎÎñÏêϸÐÅÏ¢½âÎö # @param path ·¾¶ # @param questID ÈÎÎñID # @return ¿ÉдÈë±íµÄ×Ö·û´® # @remarks º¯ÊýÏêϸ˵Ã÷£ºÈÎÎñÏêϸÐÅÏ¢½âÎö def ReadMissionInfo(path, questID): global g_GuideDict if os.path.exists(path) != True: return snake = '' #ÒѽÓÈÎÎñ xmlLoader = IPY_XMLLoader.IPY_XMLLoader() xmlLoader.LoadFromFile(path) questNode = xmlLoader.GetNodeList().FindNode('quests') #Ïòµ¼ÈÎÎñ xmlGuideLoader = IPY_XMLLoader.IPY_XMLLoader() xmlGuideLoader.LoadFromFile(path) #Ψһquests / quest for i in range(0, questNode.GetChildCount()): curQuest = questNode.GetChild(i) missionID = curQuest.GetAttribute('id') npcId = curQuest.GetAttribute('npc') if npcId == '': npcId = 0 snake = Snake(snake, missionID) snake = Snake(snake, curQuest.GetAttribute('ms_code')) #TaskInfo תºº×Ö snake = Snake(snake, curQuest.GetAttribute('type')) snake = Snake(snake, npcId) snake = Snake(snake, curQuest.GetAttribute('lv')) snake = Snake(snake, curQuest.GetAttribute('color_lv')) snake = Snake(snake, curQuest.GetAttribute('can_del')) questMsgDict = {} # ÈÎÎñÇé½Ú questRewardsDict = {} # ÈÎÎñ½±Àø questLightsDict = {} # ÈÎÎñNPCµÆ questConditionDict = {} # ÈÎÎñÍê³ÉÌõ¼þ #Ψһdescriptions descriptions = curQuest.FindChildNode('descriptions') #ÈÎÎñÃèÊö for j in range(0, descriptions.GetChildCount()): curDesc = descriptions.GetChild(j) #Çé½Ú descInfo = curDesc.FindChildNode('msg') if descInfo: questMsgDict["%s" % j] = descInfo.GetAttribute('code') #¶à¸ö½±Àø curRewardDict = {} rewardInfo = curDesc.FindChildNode('rewards') if rewardInfo: for k in range(0, rewardInfo.GetChildCount()): reward = rewardInfo.GetChild(k) job = '' sex = '' key = '-' firstType = reward.GetAttribute('type') secondType = reward.GetAttribute('type2') if firstType and firstType.lower() == 'job': #'J1' job = 'J' + reward.GetAttribute('value') key = job if secondType and secondType.lower() == 'sex': #'J1-S1' sex = 'S' + reward.GetAttribute('value2') key = job + '-' + sex elif firstType and firstType.lower() == 'sex': #'S1' sex = 'S' + reward.GetAttribute('value') key = sex #µ¥¸ö½±Àø curReward = reward.FindChildNode('msg') curRewardDict[key] = curReward.GetAttribute('code') questRewardsDict["%s" % j] = curRewardDict #¶à¸öNPCµÆ lightDict = {} lightInfo = curDesc.FindChildNode('lights') if lightInfo: for l in range(0, lightInfo.GetChildCount()): light = lightInfo.GetChild(l) #µ¥¸öNPCµÆ lightDict["%s" % light.GetAttribute('npcid')] = light.GetAttribute('type').strip() questLightsDict["%s" % j] = lightDict #ÈÎÎñÍê³ÉÌõ¼þ conditionDict = {} conditionInfo = curDesc.FindChildNode('mission_info') if conditionInfo: for m in range(0, conditionInfo.GetChildCount()): condition = conditionInfo.GetChild(m) conditionDict["%s" % m] = condition.GetAttribute('code') questConditionDict["%s" % j] = conditionDict snake = Snake(snake, questMsgDict) snake = Snake(snake, questRewardsDict) snake = Snake(snake, questLightsDict) snake = Snake(snake, questConditionDict) guideDesc = g_GuideDict.get(missionID, "-\t0") snake = Snake(snake, guideDesc) szDayCount = curQuest.GetAttribute('day_count') if not szDayCount: szDayCount = '-' snake = Snake(snake, szDayCount) return snake ## È«¾Öº¯Êý¼òҪ˵Ã÷£ºµ¥ÈÎÎñ´¦Àí # @param path ·¾¶ # @param questID ÈÎÎñID # @return ¿ÉдÈë±íµÄ×Ö·û´® # @remarks º¯ÊýÏêϸ˵Ã÷£º´¦ÀíÈÎÎñÉú³É¿ÉдÈë±íµÄ×Ö·û´®£¬ÈÎÎñID Ϊ0Åųý def ReadSingleQuestInfo(filePath, questID): if os.path.isdir(filePath)!= True: return if questID == 0: return Log4P.Debug(filePath) return ReadMissionInfo(os.path.join(filePath, '%d.xml'%questID), questID) ## È«¾Öº¯Êý¼òҪ˵Ã÷£º±íÖÐÏÈдÈëIDÃû³ÆÐÐ # @param taskFile file¶ÔÏó # @return ÎÞ # @remarks º¯ÊýÏêϸ˵Ã÷£ºÔÚ±íǰÁ½ÐÐдÈ룬ÈÎÎñ±êʶ£¬ÈÎÎñ×¢ÊÍ def PreSnake(taskFile): pyTaskHead = open(PyTaskHead, 'r') headInfo = pyTaskHead.read() taskFile.write(headInfo.decode("gbk").encode("utf8")) #taskFile.write('%s' % headInfo) return ## È«¾Öº¯Êý¼òҪ˵Ã÷£º½«ÈÎÎñÐÅϢдÈë±í # @param taskFile file¶ÔÏó # @param snake ´æÈÎÎñµÄ×Ö·û´® # @return ÎÞ # @remarks º¯ÊýÏêϸ˵Ã÷£º½«´æÈÎÎñµÄ×Ö·û´®Ð´Èë±íÖÐ def HentSnake(taskFile, snake): if not snake: return text = "\n"+snake.replace("\'", "\"") taskFile.write(text.decode("gbk").encode("utf8")) #taskFile.write("\n"+snake.replace("\'", "\"")) ## È«¾Öº¯Êý¼òҪ˵Ã÷£º±éÀú´¦Àíÿ¸öÈÎÎñ # @param filePath ·¾¶ # @return ÎÞ # @remarks º¯ÊýÏêϸ˵Ã÷£º´¦Àí½«ÈÎÎñдÈë±í def ReadQuestPath(filePath): if os.path.isdir(filePath)!= True: return dirs = os.listdir(filePath) taskFile = open(TASKTABLEPATH, 'w') PreSnake(taskFile) for curDir in dirs: path = os.path.join(filePath, curDir) snake = ReadSingleQuestInfo(path, CommFunc.ToIntDef(curDir, 0)) HentSnake(taskFile, snake) taskFile.close() return ## È«¾Öº¯Êý¼òҪ˵Ã÷£ºÏòµ¼ÈÎÎñÃèÊöÐÅÏ¢ # @param path ·¾¶ # @return ÎÞ # @remarks º¯ÊýÏêϸ˵Ã÷£º´æ´¢ÈÎÎñÏòµ¼ÃèÊöÐÅÏ¢ def ReadMissionDescription(path): global g_GuideDict xmlLoader = IPY_XMLLoader.IPY_XMLLoader() xmlLoader.LoadFromFile(path) questNode = xmlLoader.GetNodeList().FindNode('quests') for i in range(questNode.GetChildCount()): curQuestNode = questNode.GetChild(i) questID = curQuestNode.GetAttribute('id') #Ïòµ¼ÖÐÊÇ·ñÏÔʾ½±Àø 1ÏÔ 0·ñ if curQuestNode.GetAttribute('have_reward'): showReward = 1 else: showReward = 0 desc = curQuestNode.FindChildNode('msg').GetAttribute('code') g_GuideDict.update({questID : "%s\t%s"%(desc, showReward)}) ## È«¾Öº¯Êý¼òҪ˵Ã÷£ºC++ÌṩXML½âÎö # @param ÎÞ # @return ÎÞ # @remarks º¯ÊýÏêϸ˵Ã÷£ºC++ÌṩXML³õʼ»¯ºÍ¹Ø±Õ def Runing(): clientPyTaskPath = os.path.join(ClientConfigPath, "PyTask.txt") if not os.path.isfile(clientPyTaskPath): Log4P.Error("ÕÒ²»µ½Ç°¶ËÏîÄ¿ PyTask.txt ·¾¶!", clientPyTaskPath, "ÇëÐÞ¸Ä TaskManager.ini ÖеÄÅäÖà ClientConfigPath") return if CommFunc.is_open(clientPyTaskPath): Log4P.Error("ÁíÒ»¸ö³ÌÐòÕýÔÚʹÓôËÎļþ£¬½ø³ÌÎÞ·¨·ÃÎÊ¡£", clientPyTaskPath) return #xml¶ÁÈ¡Æ÷µÄ³õʼ»¯¶¯×÷, Èç¹ûûÓмÓÕâÐо͵÷ÓÃ, ¾Í»á±¨´í IPY_XMLLoader.PyCoInitialize() questPath = QUESTDATAPath ReadMissionDescription(os.path.join(QUESTDATAPath, 'MissionDescription.xml')) dirs = os.listdir(questPath) for curDir in dirs: path = os.path.join(questPath, curDir) if curDir.lower() == 'quests': ReadQuestPath(path) IPY_XMLLoader.PyCoUninitialize() os.system("copy %s %s" % (TASKTABLEPATH, clientPyTaskPath)) # Ö±½Ó¿½±´µ½Ç°¶ËÅäÖà Log4P.Info("µ¼³ö¿Í»§¶ËÎÄ×ÖÄÚÈÝÍê±Ï£¡PyTask.txt") return Runing()