def main(): os.chdir(os.path.split(os.path.realpath(__file__))[0]) welecome() print('') confirm = InputController().requireBool({ 'tips': '是否立刻进行文件编码转换?', 'default': False }) if not confirm: Message.ShowInfo('您取消了操作, 程序终止...\n') Common.exitWithPause() count = CharsetConverter({ 'ignore_files': ['Makefile', 'Makefile.in', 'CMakeLists.txt'], 'process_exts': ['.hpp', '.cpp'] }).convertDirectory('../../src', 'UTF-8-SIG') if count <= 0: Message.ShowInfo('很好! 源代码文件都已转换为 UTF-8-SIG 编码.') print('') Common.exitWithPause()
def __searchMark(self, filename): line_num = 0 charset = self.__detectCharset(filename) regex = r'\s*?' + self.__options__['mark_format'] + r'\s*?' if self.__detectCharset(filename).upper() != 'UTF-8-SIG': print('No UTF-8-SIG: %s' % (filename)) return try: textfile = open(filename, encoding=charset) for line in textfile: line_num = line_num + 1 if '//' not in line: continue re_match = re.match(regex, line) if not re_match: continue if str(re_match.group(1)) in self.mark_dict: print('发现重复的代码注入标记: ' + re_match.group(0)) Common.exitWithPause(-1) self.mark_dict[re_match.group(1)] = { 'index': int(re_match.group(1)), 'filepath': filename, 'line': line_num } textfile.close() except Exception as err: print('Error filename : %s | Message : %s' % (filename, err))
def requireSelect(self, options): print('-' * 70) select_name = options['name'] select_data = options['data'] Message.ShowSelect('请选择%s, 可选值为 [0~%d], 分别代表:' % (select_name, len(select_data) - 1)) print('') for select in select_data: Message.ShowMenu('%s' % select['desc']) print('') Message.ShowSelect('请选择%s [0~%d]:' % (select_name, len(select_data) - 1), end="") user_select = input() if not user_select or not user_select.isnumeric(): Message.ShowError('您输入了无效的地图标记类型, 程序终止') print('-' * 70) Common.exitWithPause(-1) user_select = int(user_select) if user_select < 0 or user_select >= len(select_data): Message.ShowError('您输入了无效的地图标记类型, 程序终止') print('-' * 70) Common.exitWithPause(-1) print('') Message.ShowInfo('您选择的是: %s' % select_data[user_select]['name']) print('-' * 70) print('\n') return user_select
def __init__(self, options): self.__options__ = options self.mark_dict = {} if not self.detect(self.__options__['source_dirs']): print('[状态] 无法成功定位所有需要的代码注入点, 程序终止!') Common.exitWithPause(-1) else: print('[状态] 已成功定位所有代码注入点.\n')
def main(): os.chdir(os.path.split(os.path.realpath(__file__))[0]) welecome() options = { 'source_dirs' : '../../src', 'process_exts' : ['.hpp', '.cpp'], 'mark_format' : r'// PYHELP - MAPFLAG - INSERT POINT - <Section (\d{1,2})>', 'mark_counts' : 11 } guide(InjectController(options)) Common.exitWithPause()
def requireText(self, options): print('-' * 70) Message.ShowSelect(options['tips'] + ':') result = input(options['prefix']) if not result: Message.ShowError('请至少输入一个字符. 程序终止') print('-' * 70) Common.exitWithPause(-1) result = options['prefix'] + result if options['upper']: result = result.upper() Message.ShowInfo('您输入的是: ' + result) print('-' * 70) print('\n') return result
def guide(inject): eventlist = [{ 'name': 'Event 类型的标准事件', 'desc': '0 - Event 类型的标准事件, 不能被 processhalt 指令打断' }, { 'name': 'Filter 类型的过滤事件', 'desc': '1 - Filter 类型的过滤事件, 可以被 processhalt 指令打断' }] # 0 为 Event 类型的事件 | 1 为 Filter 类型的事件 eventtype = InputController().requireSelect({ 'name': '想创建的 NPC 事件类型', 'data': eventlist }) # -------- constant_prefix = 'NPCE_' if eventtype == 0 else 'NPCF_' constant = InputController().requireText({ 'tips': '请输入该 NPC 事件的 {prefix} 常量名称 (自动大写, {prefix}的末尾部分)'.format( prefix=constant_prefix), 'prefix': constant_prefix, 'upper': True }) if eventtype == 0: define = 'rAthenaCN_NpcEvent_' + constant.replace(constant_prefix, '') eventvar = constant.replace(constant_prefix, '').lower() + '_event_name' elif eventtype == 1: define = 'rAthenaCN_NpcFilter_' + constant.replace(constant_prefix, '') eventvar = constant.replace(constant_prefix, '').lower() + '_filter_name' else: Message.ShowError('发现无效的事件类型, 请确认..') Common.exitWithPause(-1) # -------- eventname = InputController().requireText({ 'tips': '请输入该 NPC 事件的名称 (以 On 开头, 末尾应为 Event 或 Filter)', 'prefix': '' }) if not eventname.startswith('On'): Message.ShowError('无论是什么类型的事件, 事件名称必须以 On 开头 (严格区分大小写)') Common.exitWithPause(-1) if eventtype == 0: if not eventname.endswith('Event'): Message.ShowError('Event 类型的事件, 事件名称必须以 Event 结尾 (严格区分大小写)') Common.exitWithPause(-1) if eventtype == 1: if not eventname.endswith('Filter'): Message.ShowError('Filter 类型的事件, 事件名称必须以 Filter 结尾 (严格区分大小写)') Common.exitWithPause(-1) # -------- eventdesc = InputController().requireText({ 'tips': '请输入该 NPC 事件的简短说明 (如: 当玩家杀死 MVP 魔物时触发事件)', 'prefix': '' }) # -------- print('-' * 70) Message.ShowInfo('请确认建立的信息, 确认后将开始修改代码.') print('-' * 70) Message.ShowInfo('事件类型 : %s' % eventlist[eventtype]['name']) Message.ShowInfo('常量名称 : %s' % constant) Message.ShowInfo('事件名称 : %s' % eventname) Message.ShowInfo('事件说明 : %s' % eventdesc) print('') Message.ShowInfo('开关名称 : %s' % define) Message.ShowInfo('变量名称 : %s' % eventvar) print('-' * 70) print('\n') nextstep = InputController().requireBool({ 'tips': '请仔细阅读上述信息, 确认要开始写入操作么?', 'default': False }) if not nextstep: Message.ShowStatus('终止写入操作, 程序终止') Common.exitWithPause(-1) # -------- Message.ShowStatus('开始将 NPC 事件写入到源代码...') options = { 'define': define, 'constant': constant, 'eventname': eventname, 'eventvar': eventvar, 'eventdesc': eventdesc } if eventtype == 0: insert_for_normal_npcevent(inject, options) elif eventtype == 1: insert_for_filter_npcevent(inject, options) Message.ShowStatus('已经成功写入到源代码, 请检查并完善必要的注释.') print('') print('=' * 70) print('') print('感谢您的使用, NPC 事件添加助手已经执行完毕'.center(48)) print('') print('=' * 70)
def guide(inject): define = InputController().requireText({ 'tips': '请输入该地图标记的宏定义开关名称 (Pandas_MapFlag_的末尾部分)', 'prefix': 'Pandas_MapFlag_' }) # -------- constant = InputController().requireText({ 'tips': '请输入该地图标记的 MF 常量名称 (自动大写, MF_的末尾部分)', 'prefix': 'MF_', 'upper': True }) # -------- flaglist = [{ 'name': '普通开关式的地图标记', 'desc': '0 - 普通的地图标记开关, 只有两个状态(开/关)' }, { 'name': '携带单个数值参数的地图标记', 'desc': '1 - 携带单个数值参数的地图标记, 可以记录数值变量 (例如 bexp 标记)' }, { 'name': '复杂赋值标记', 'desc': '2 - 复杂的赋值标记, 只单纯添加宏定义和 MF 常量, 其他的手动添加' }] # flagtype = 0 # 0 为普通开关 | 1 为数值开关 flagtype = InputController().requireSelect({ 'name': '想创建的地图标记类型', 'data': flaglist }) # -------- var_name_1 = None if flagtype == 1: var_name_1 = InputController().requireText({ 'tips': '请输入用于记录"第一个数值参数"的 map_data 结构成员变量名', 'prefix': '' }) # -------- zero_disable = False if flagtype == 1: zero_disable = InputController().requireBool({ 'tips': '当"第一个数值参数"的值为 0 时, 是否表示移除此地图标记?', 'default': False }) # -------- print('-' * 70) Message.ShowInfo('请确认建立的信息, 确认后将开始修改代码.') print('-' * 70) Message.ShowInfo('开关名称 : %s' % define) Message.ShowInfo('常量名称 : %s' % constant) Message.ShowInfo('标记类型 : %s' % flaglist[flagtype]['name']) print('') Message.ShowInfo('第一个数值参数名称 : %s' % var_name_1) Message.ShowInfo('第一个数值参数的值为 0 时, 是否禁用此标记 : %s' % zero_disable) print('-' * 70) print('\n') nextstep = InputController().requireBool({ 'tips': '请仔细阅读上述信息, 确认要开始写入操作么?', 'default': False }) if not nextstep: Message.ShowStatus('终止写入操作, 程序终止') Common.exitWithPause(-1) # -------- Message.ShowStatus('开始将地图标记信息写入到源代码...') options = { 'define': define, 'constant': constant, 'var_name_1': var_name_1, 'zero_disable': zero_disable } if flagtype == 0: insert_for_normal_mapflag(inject, options) elif flagtype == 1: insert_for_one_param_mapflag(inject, options) Message.ShowStatus('已经成功写入到源代码, 请检查并完善必要的注释.') print('') print('=' * 70) print('') print('感谢您的使用, 地图标记添加助手已经执行完毕'.center(48)) print('') print('=' * 70)
def guide(inject): define = InputController().requireText({ 'tips': '请输入该脚本指令的宏定义开关名称 (Pandas_ScriptCommand_的末尾部分)', 'prefix': 'Pandas_ScriptCommand_' }) # -------- funcname = InputController().requireText({ 'tips': '请输入该脚本指令的处理函数名称 (BUILDIN_FUNC 部分的函数名)', 'prefix': '', 'lower': True }) # -------- samefunc = InputController().requireBool({ 'tips': '脚本指令是否与处理函数名称一致 (%s)?' % funcname, 'default': True }) # -------- cmdname = funcname if not samefunc: cmdname = InputController().requireText({ 'tips': '请输入该脚本指令的名称 (BUILDIN_DEF2 使用)', 'prefix': '', 'lower': True }) # -------- argsmode = InputController().requireText({ 'tips': '请输入该脚本指令的参数模式 (如一个或多个的: i\s\? 为空则直接回车)', 'prefix': '', 'lower': True, 'allow_empty': True }) # -------- print('-' * 70) Message.ShowInfo('请确认建立的信息, 确认后将开始修改代码.') print('-' * 70) Message.ShowInfo('开关名称 : %s' % define) Message.ShowInfo('脚本处理函数名称 : %s' % funcname) Message.ShowInfo('脚本指令名称 : %s' % cmdname) Message.ShowInfo('脚本指令的参数模式 : %s' % argsmode) print('-' * 70) print('\n') nextstep = InputController().requireBool({ 'tips': '请仔细阅读上述信息, 确认要开始写入操作么?', 'default': False }) if not nextstep: Message.ShowStatus('终止写入操作, 程序终止') Common.exitWithPause(-1) # -------- Message.ShowStatus('开始将地图标记信息写入到源代码...') options = { 'define': define, 'funcname': funcname, 'cmdname': cmdname, 'argsmode': argsmode } insert_scriptcmd(inject, options) Message.ShowStatus('已经成功写入到源代码, 请检查并完善必要的注释.') print('') print('=' * 70) print('') print('感谢您的使用, 脚本指令添加助手已经执行完毕'.center(48)) print('') print('=' * 70)