class LeeSkilldescriptLua: def __init__(self): self.leeCommon = LeeCommon() self.skilldescriptDict = {} self.SKID = [] self.singleSkilldescriptFormat = '\t[SKID.%s] = {\r\n%s\r\n\t}%s' self.skillDescriptFormat = 'SKILL_DESCRIPT = {\r\n%s\r\n}\r\n' def createLuaTable(self, luaContent, regex, pos, tableName): matches = re.finditer(regex, luaContent, re.MULTILINE | re.IGNORECASE | re.DOTALL) tables = [] for match in matches: tables.append(match.group(pos)) tables = set(tables) setattr(self, tableName, list(tables)) contentList = [] for num, item in enumerate(tables): contentList.append('%s = %s' % (item, num + 1)) return '%s = { %s }' % (tableName, ', '.join(contentList)) def getSkillConstant(self, skillFakeID): return self.SKID[skillFakeID - 1] def load(self, filepath): self.skilldescriptDict.clear() luafile = open(filepath, 'r', encoding='latin1') content = luafile.read() luafile.close() # 读取并构建假设的 SKID 常量列表 SKIDTableContent = self.createLuaTable( content, r"[\[|{]\s*SKID\.(.*?)\s*[,|}|\]]", 1, 'SKID') # 读取上面构建的常量列表 lua = LuaRuntime(unpack_returned_tuples=True) lua.execute(SKIDTableContent) # 然后正式载入 skillinfolist 接下来进行处理 lua.execute(content) # 再将信息提取到内存中存储起来 g = lua.globals() for skillFakeID in list(g.SKILL_DESCRIPT): skillDescriptLuaObject = g.SKILL_DESCRIPT[skillFakeID] skillConstant = self.getSkillConstant(skillFakeID) descriptLines = [] for descriptLine in list(skillDescriptLuaObject): descriptLines.append(skillDescriptLuaObject[descriptLine]) descriptSingleItem = LeeSkilldescriptSingleItem( Constant=skillConstant, Description='\r\n'.join(descriptLines)) self.skilldescriptDict[skillConstant] = descriptSingleItem def save(self, savepath): fullSkilldescriptText = [] for skillConstant in self.skilldescriptDict: skillDescriptLines = [] skillDescriptText = self.skilldescriptDict[ skillConstant].Description skillDescriptList = skillDescriptText.split('\r\n') for line in skillDescriptList: skillDescriptLines.append( '\t\t"%s"%s' % (line, self.leeCommon.isLastReturn( skillDescriptList, line, '', ','))) singleSkilldescriptText = self.singleSkilldescriptFormat % ( skillConstant, '\r\n'.join(skillDescriptLines), self.leeCommon.isLastReturn(self.skilldescriptDict, skillConstant, '', ',')) fullSkilldescriptText.append(singleSkilldescriptText) luaContent = self.skillDescriptFormat % ( '\r\n'.join(fullSkilldescriptText)) fullSavePath = os.path.abspath(savepath) os.makedirs(os.path.dirname(fullSavePath), exist_ok=True) luafile = open(fullSavePath, 'w', encoding='latin1', newline='') luafile.write(luaContent.replace('\r\r', '\r')) luafile.close() def clear(self): self.skilldescriptDict.clear() def items(self): return self.skilldescriptDict def getSkilldescript(self, skillConstant): return None if skillConstant not in self.skilldescriptDict else self.skilldescriptDict[ skillConstant] def getItemAttribute(self, skillConstant, attribname, dstEncode='gbk'): try: skilldata = self.getSkilldescript(skillConstant) if skilldata == None: return None value = getattr(skilldata, attribname, None) if value == None: return None if isinstance(value, list): for index, val in enumerate(value): value[index] = val.encode('latin1').decode( dstEncode, errors='backslashreplace') return value else: return value.encode('latin1').decode(dstEncode, errors='backslashreplace') except: print('getItemAttribute: 处理 %s 的 %s 字段时出问题, 内容为: \r\n%s', (skillConstant, attribname, value)) raise def setItemAttribute(self, skillConstant, attribname, value, srcEncode='gbk'): try: skilldata = self.getSkilldescript(skillConstant) if skilldata == None: return False if isinstance(value, list): for index, val in enumerate(value): value[index] = val.encode(srcEncode).decode('latin1') else: value = value.encode(srcEncode).decode('latin1') return setattr(self.skilldescriptDict[skillConstant], attribname, value) except: print('setItemAttribute: 处理 %d 的 %s 字段时出问题, 内容为: \r\n%s', (skillConstant, attribname, value)) raise
class LeeIteminfoLua: def __init__(self): self.leeCommon = LeeCommon() self.itemInfoDict = {} self.singleItemFormat = \ ''' [%s] = { unidentifiedDisplayName = "%s", unidentifiedResourceName = "%s", unidentifiedDescriptionName = { %s }, identifiedDisplayName = "%s", identifiedResourceName = "%s", identifiedDescriptionName = { %s }, slotCount = %s, ClassNum = %s }%s'''.replace('\n', '\r\n').replace('\r\r', '\r') self.itemInfoFormat = \ '''tbl = { %s } main = function() for ItemID,DESC in pairs(tbl) do result, msg = AddItem(ItemID, DESC.unidentifiedDisplayName, DESC.unidentifiedResourceName, DESC.identifiedDisplayName, DESC.identifiedResourceName, DESC.slotCount, DESC.ClassNum) if not result then return false, msg end for k,v in pairs(DESC.unidentifiedDescriptionName) do result, msg = AddItemUnidentifiedDesc(ItemID, v) if not result then return false, msg end end for k,v in pairs(DESC.identifiedDescriptionName) do result, msg = AddItemIdentifiedDesc(ItemID, v) if not result then return false, msg end end end return true, "good" end '''.replace('\n', '\r\n').replace('\r\r', '\r') def __normdesc(self, desc): descLines = [] for lineNo in desc: descLines.append(desc[lineNo]) return None if not descLines else '\r\n'.join(descLines) def __quotedesc(self, descLines): if descLines is None: return '' descLines = descLines.replace('\r\n', '\n').split('\n') for index, line in enumerate(descLines): line = line.replace('"', r'\"').replace(r'\\', '\\') descLines[index] = '\t\t\t"%s"%s' % (line, ',' if (index + 1) < len(descLines) else '') return '' if not descLines else '\r\n'.join(descLines) def load(self, filepath): self.itemInfoDict.clear() try: luafile = open(filepath, 'r', encoding = 'latin1') content = luafile.read() luafile.close() lua = LuaRuntime(unpack_returned_tuples=True) lua.execute(content) g = lua.globals() except Exception as _err: print('解析文件时发生了错误: %s' % filepath) raise for itemID in list(g.tbl): try: singleItem = LeeIteminfoSingleItem( itemID = itemID, unidentifiedDisplayName = g.tbl[itemID]['unidentifiedDisplayName'], unidentifiedResourceName = g.tbl[itemID]['unidentifiedResourceName'], unidentifiedDescriptionName = self.__normdesc( g.tbl[itemID]['unidentifiedDescriptionName'] ), identifiedDisplayName = g.tbl[itemID]['identifiedDisplayName'], identifiedResourceName = g.tbl[itemID]['identifiedResourceName'], identifiedDescriptionName = self.__normdesc( g.tbl[itemID]['identifiedDescriptionName'] ), slotCount = g.tbl[itemID]['slotCount'], ClassNum = g.tbl[itemID]['ClassNum'], ) self.itemInfoDict[self.leeCommon.atoi(itemID)] = singleItem except Exception as _err: print('Error Item ID = %d' % itemID) raise def save(self, savepath): # 构建表格主体部分, 先定义一下格式部分 fullItemText = [] # 保存每一个道具完整的文本段 for itemID in sorted(self.itemInfoDict): singleItemText = self.singleItemFormat % ( self.itemInfoDict[itemID].itemID, self.itemInfoDict[itemID].unidentifiedDisplayName, self.itemInfoDict[itemID].unidentifiedResourceName, self.__quotedesc(self.itemInfoDict[itemID].unidentifiedDescriptionName), self.itemInfoDict[itemID].identifiedDisplayName, self.itemInfoDict[itemID].identifiedResourceName, self.__quotedesc(self.itemInfoDict[itemID].identifiedDescriptionName), self.itemInfoDict[itemID].slotCount, self.itemInfoDict[itemID].ClassNum, self.leeCommon.isLastReturn(sorted(self.itemInfoDict), itemID, '', ',') ) fullItemText.append(singleItemText) luaContent = self.itemInfoFormat % ('\r\n'.join(fullItemText)) fullSavePath = os.path.abspath(savepath) os.makedirs(os.path.dirname(fullSavePath), exist_ok = True) luafile = open(fullSavePath, 'w', encoding = 'latin1', newline = '') luafile.write(luaContent.replace('\r\r', '\r')) luafile.close() def items(self): return self.itemInfoDict def getIteminfo(self, itemID): return None if itemID not in self.itemInfoDict else self.itemInfoDict[itemID] def getItemAttribute(self, itemID, attribname, dstEncode = 'gbk'): try: itemdata = self.getIteminfo(itemID) if itemdata is None: return None value = getattr(itemdata, attribname, None) if value is None: return None if isinstance(value, list): for index, val in enumerate(value): value[index] = val.encode('latin1').decode(dstEncode) return value else: return value.encode('latin1').decode(dstEncode) except: print('getItemAttribute: 处理 %d 的 %s 字段时出问题, 内容为: \r\n%s', (itemID, attribname, value)) raise def setItemAttribute(self, itemID, attribname, value, srcEncode = 'gbk'): try: itemdata = self.getIteminfo(itemID) if itemdata is None: return False if isinstance(value, list): for index, val in enumerate(value): value[index] = val.encode(srcEncode).decode('latin1') else: value = value.encode(srcEncode).decode('latin1') return setattr(self.itemInfoDict[itemID], attribname, value) except: print('setItemAttribute: 处理 %d 的 %s 字段时出问题, 内容为: \r\n%s', (itemID, attribname, value)) raise def clear(self): self.itemInfoDict.clear()
class LeeSkillinfolistLua: def __init__(self): self.leeCommon = LeeCommon() self.skillinfolistDict = {} self.SKID = [] self.JOBID = [] self.singleSkillinfoFormat = \ ''' [SKID.%s] = { "%s", SkillName = "%s", MaxLv = %s, SpAmount = { %s }, bSeperateLv = %s, AttackRange = { %s }%s }%s'''.replace('\n', '\r\n').replace('\r\r', '\r') self._neeskillListFormat = ',\r\n\t\t_NeedSkillList = {\r\n%s\r\n\t\t}' self.neeskillListFormat = ',\r\n\t\tNeedSkillList = {\r\n%s\r\n\t\t}' self.jobDepentFormat = '\t\t\t[JOBID.%s] = {\r\n%s\r\n\t\t\t}%s' self.skillScaleListFormat = ',\r\n\t\tSkillScale = {\r\n%s\r\n\t\t}' self.skillScaleItemFormat = '\t\t\t[%s] = { x = %s, y = %s }%s' self.skillinfoListFormat = 'SKILL_INFO_LIST = {\r\n%s\r\n}\r\n' def createLuaTable(self, luaContent, regex, pos, tableName): matches = re.finditer(regex, luaContent, re.MULTILINE | re.IGNORECASE | re.DOTALL) tables = [] for match in matches: tables.append(match.group(pos)) tables = set(tables) setattr(self, tableName, list(tables)) contentList = [] for num, item in enumerate(tables): contentList.append('%s = %s' % (item, num + 1)) return '%s = { %s }' % (tableName, ', '.join(contentList)) def getSkillConstant(self, skillFakeID): return self.SKID[skillFakeID - 1] def getJobIdConstant(self, jobFakeID): return self.JOBID[jobFakeID - 1] def load(self, filepath): self.skillinfolistDict.clear() luafile = open(filepath, 'r', encoding='latin1') content = luafile.read() luafile.close() # 读取并构建假设的 SKID 常量列表 SKIDTableContent = self.createLuaTable( content, r"[\[|{]\s*SKID\.(.*?)\s*[,|}|\]]", 1, 'SKID') # 读取并构建假设的 JOBID 常量列表 JOBIDTableContent = self.createLuaTable( content, r"[\[|{]\s*JOBID\.(.*?)\s*[,|}|\]]", 1, 'JOBID') # 读取上面构建的两个常量列表 lua = LuaRuntime(unpack_returned_tuples=True) lua.execute(SKIDTableContent) lua.execute(JOBIDTableContent) # 然后正式载入 skillinfolist 接下来进行处理 lua.execute(content) # 再将信息提取到内存中存储起来 g = lua.globals() dummyClass = LeeSkillinfoSingleItem(Constant='', SkillName='', MaxLv=0, Type='', SpAmount=[], bSeperateLv=False, AttackRange=[], _NeedSkillList=[], NeedSkillList={}, SkillScale=[]) for skillFakeID in list(g.SKILL_INFO_LIST): dummyClass.SpAmount.clear() dummyClass.AttackRange.clear() dummyClass._NeedSkillList.clear() dummyClass.NeedSkillList.clear() dummyClass.SkillScale.clear() skillItemLuaObject = g.SKILL_INFO_LIST[skillFakeID] skillConstant = self.getSkillConstant(skillFakeID) for attributeName in list(skillItemLuaObject): if attributeName == 1: dummyClass.Constant = skillItemLuaObject[attributeName] elif attributeName in ['SkillName']: dummyClass.SkillName = skillItemLuaObject[attributeName] elif attributeName in ['SpAmount', 'AttackRange']: strValueList = [] for key in list(skillItemLuaObject[attributeName]): strValueList.append( str(skillItemLuaObject[attributeName][key])) setattr(dummyClass, attributeName, strValueList) elif attributeName in ['_NeedSkillList']: for needID in list(skillItemLuaObject[attributeName]): needItem = skillItemLuaObject[attributeName][needID] needSkillItem = LeeNeedSkillItem( Constant=self.getSkillConstant(needItem[1]), SkillFakeID=needItem[1], RequireLv=needItem[2]) dummyClass._NeedSkillList.append(needSkillItem) elif attributeName in ['SkillScale']: for scaleLevel in list(skillItemLuaObject[attributeName]): scaleInfoItems = skillItemLuaObject[attributeName][ scaleLevel] scaleInfo = LeeSkillScaleItem(lv=scaleLevel, x=scaleInfoItems['x'], y=scaleInfoItems['y']) dummyClass.SkillScale.append(scaleInfo) elif attributeName in ['NeedSkillList']: for jobID in list(skillItemLuaObject[attributeName]): jobConstant = self.getJobIdConstant(jobID) jobItems = skillItemLuaObject[attributeName][jobID] jobNeedSkillList = [] for needID in list(jobItems): needItem = jobItems[needID] needSkillItem = LeeNeedSkillItem( Constant=self.getSkillConstant(needItem[1]), SkillFakeID=needItem[1], RequireLv=needItem[2]) jobNeedSkillList.append(needSkillItem) dummyClass.NeedSkillList[ jobConstant] = jobNeedSkillList elif hasattr(dummyClass, attributeName): setattr(dummyClass, attributeName, skillItemLuaObject[attributeName]) else: self.leeCommon.exitWithMessage( '技能 %s 存在未知的属性 "%s", 请进行处理' % (self.getSkillConstant(skillFakeID), attributeName)) self.skillinfolistDict[skillConstant] = copy.deepcopy(dummyClass) def save(self, savepath): fullSkillinfolistText = [] for skillConstant in self.skillinfolistDict: _needSkillContent = [] for needskill in self.skillinfolistDict[ skillConstant]._NeedSkillList: _needSkillContent.append( '\t\t\t{ SKID.%s, %s }%s' % (needskill.Constant, needskill.RequireLv, self.leeCommon.isLastReturn( self.skillinfolistDict[skillConstant]._NeedSkillList, needskill, '', ','))) _needSkillListText = '' if len(self.skillinfolistDict[skillConstant]._NeedSkillList) <= 0 else \ self._neeskillListFormat % ( '\r\n'.join(_needSkillContent) ) ### needSkillContent = [] for jobConstant in self.skillinfolistDict[ skillConstant].NeedSkillList: jobNeedSkillText = [] for needskill in self.skillinfolistDict[ skillConstant].NeedSkillList[jobConstant]: jobNeedSkillText.append( '\t\t\t\t{ SKID.%s, %s }%s' % (needskill.Constant, needskill.RequireLv, self.leeCommon.isLastReturn( self.skillinfolistDict[skillConstant]. NeedSkillList[jobConstant], needskill, '', ','))) jobDependText = self.jobDepentFormat % ( jobConstant, '\r\n'.join(jobNeedSkillText), self.leeCommon.isLastReturn( self.skillinfolistDict[skillConstant].NeedSkillList, jobConstant, '', ',')) needSkillContent.append(jobDependText) needSkillListText = '' if len(self.skillinfolistDict[skillConstant].NeedSkillList) <= 0 else \ self.neeskillListFormat % ( '\r\n'.join(needSkillContent) ) ### skillScaleContent = [] for scaleInfo in self.skillinfolistDict[skillConstant].SkillScale: skillScaleItemText = self.skillScaleItemFormat % ( scaleInfo.lv, scaleInfo.x, scaleInfo.y, self.leeCommon.isLastReturn( self.skillinfolistDict[skillConstant].SkillScale, scaleInfo, '', ',')) skillScaleContent.append(skillScaleItemText) skillScaleText = '' if len(self.skillinfolistDict[skillConstant].SkillScale) <= 0 else \ self.skillScaleListFormat % ( '\r\n'.join(skillScaleContent) ) ### singleItemText = self.singleSkillinfoFormat % ( self.skillinfolistDict[skillConstant].Constant, self.skillinfolistDict[skillConstant].Constant, self.skillinfolistDict[skillConstant].SkillName, self.skillinfolistDict[skillConstant].MaxLv, ', '.join( self.skillinfolistDict[skillConstant].SpAmount), str(self.skillinfolistDict[skillConstant].bSeperateLv).lower(), ', '.join(self.skillinfolistDict[skillConstant].AttackRange), _needSkillListText + needSkillListText + skillScaleText, self.leeCommon.isLastReturn(self.skillinfolistDict, skillConstant, '', ',')) singleItemText = singleItemText.replace('{ }', '{ }') fullSkillinfolistText.append(singleItemText) luaContent = self.skillinfoListFormat % ( '\r\n'.join(fullSkillinfolistText)) fullSavePath = os.path.abspath(savepath) os.makedirs(os.path.dirname(fullSavePath), exist_ok=True) luafile = open(fullSavePath, 'w', encoding='latin1', newline='') luafile.write(luaContent.replace('\r\r', '\r')) luafile.close() def clear(self): self.skillinfolistDict.clear() def items(self): return self.skillinfolistDict def getSkillinfo(self, skillConstant): return None if skillConstant not in self.skillinfolistDict else self.skillinfolistDict[ skillConstant] def getItemAttribute(self, skillConstant, attribname, dstEncode='gbk'): try: skilldata = self.getSkillinfo(skillConstant) if skilldata == None: return None value = getattr(skilldata, attribname, None) if value == None: return None return value.encode('latin1').decode(dstEncode, errors='backslashreplace') except: print('getItemAttribute: 处理 %s 的 %s 字段时出问题, 内容为: \r\n%s', (skillConstant, attribname, value)) raise def setItemAttribute(self, skillConstant, attribname, value, srcEncode='gbk'): try: skilldata = self.getSkillinfo(skillConstant) if skilldata == None: return False value = value.encode(srcEncode).decode('latin1') return setattr(self.skillinfolistDict[skillConstant], attribname, value) except: print('setItemAttribute: 处理 %d 的 %s 字段时出问题, 内容为: \r\n%s', (skillConstant, attribname, value)) raise
class LeeTowninfoLua: def __init__(self): self.leeCommon = LeeCommon() self.towninfoDict = {} self.singleMapFormat = '\t%s = {\r\n%s\r\n\t}%s' self.singleInfoFormat = '\t\t{ name = "%s", X = %d, Y = %d, TYPE = %d }%s' self.townInfoFormat = \ '''mapNPCInfoTable = { %s } main = function() for mapName, info in pairs(mapNPCInfoTable) do for k, v in pairs(info) do result, msg = AddTownInfo(mapName, v.name, v.X, v.Y, v.TYPE) if not result == true then return false, msg end end end return true, "good" end '''.replace('\n', '\r\n').replace('\r\r', '\r') def load(self, filepath): self.towninfoDict.clear() luafile = open(filepath, 'r', encoding='latin1') content = luafile.read() luafile.close() lua = LuaRuntime(unpack_returned_tuples=True) lua.execute(content) g = lua.globals() for mapname in list(g.mapNPCInfoTable): self.towninfoDict[mapname] = [] for tagid in list(g.mapNPCInfoTable[mapname]): singleItem = LeeTowninfoSingleItem( tagname=g.mapNPCInfoTable[mapname][tagid]['name'], gbkname=g.mapNPCInfoTable[mapname][tagid]['name'].encode( 'latin1').decode('gbk'), x=g.mapNPCInfoTable[mapname][tagid]['X'], y=g.mapNPCInfoTable[mapname][tagid]['Y'], tagtype=g.mapNPCInfoTable[mapname][tagid]['TYPE']) self.towninfoDict[mapname].append(singleItem) def save(self, savepath): fullMapsText = [] for mapname in sorted(self.towninfoDict): singleItemText = [] for taginfo in self.towninfoDict[mapname]: infoText = self.singleInfoFormat % ( taginfo.tagname, taginfo.x, taginfo.y, taginfo.tagtype, self.leeCommon.isLastReturn(self.towninfoDict[mapname], taginfo, '', ',')) singleItemText.append(infoText) singleMapText = self.singleMapFormat % ( mapname, '\r\n'.join(singleItemText), self.leeCommon.isLastReturn(sorted(self.towninfoDict), mapname, '', ',')) fullMapsText.append(singleMapText) luaContent = self.townInfoFormat % ('\r\n'.join(fullMapsText)) fullSavePath = os.path.abspath(savepath) os.makedirs(os.path.dirname(fullSavePath), exist_ok=True) luafile = open(fullSavePath, 'w', encoding='latin1', newline='') luafile.write(luaContent.replace('\r\r', '\r')) luafile.close() def clear(self): self.towninfoDict.clear() def replaceName(self, oldname, newname): oldname_latin1 = oldname.encode('gbk').decode('latin1') newname_latin1 = newname.encode('gbk').decode('latin1') for mapname in self.towninfoDict: for taginfo in self.towninfoDict[mapname]: if taginfo.tagname == oldname_latin1: taginfo.tagname = newname_latin1