示例#1
0
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
示例#2
0
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()
示例#3
0
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
示例#4
0
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