コード例 #1
0
def compile_renewal(version):
    '''
    编译复兴后版本
    '''
    time.sleep(3)
    print('')

    define_options = {}

    if os.getenv("DEFINE_CRASHRPT_APPID"):
        define_options["CRASHRPT_APPID"] = '\\"%s\\"' % os.getenv(
            "DEFINE_CRASHRPT_APPID")
    if os.getenv("DEFINE_CRASHRPT_PUBLICKEY"):
        define_options["CRASHRPT_PUBLICKEY"] = '\\"%s\\"' % os.getenv(
            "DEFINE_CRASHRPT_PUBLICKEY")

    define_options["GIT_BRANCH"] = '\\"%s\\"' % Common.get_pandas_branch(
        project_slndir)
    define_options["GIT_HASH"] = '\\"%s\\"' % Common.get_pandas_hash(
        project_slndir)

    define_values = define_builder(define_options)

    if not compile_sub(define_values, '复兴后', version):
        Message.ShowError('编译复兴前版本时发生了一些错误, 请检查...')
        Common.exit_with_pause(-1)

    # 将之前 compile_prere 中临时重命名的复兴前产物全部改回正常的文件名
    if 'pre' in os.getenv('DEFINE_COMPILE_MODE').split(','):
        move_product_files('-pre-t', '-pre')

    print('')
コード例 #2
0
def process_sub(export_file, renewal, langinfo):
    print('')
    
    # 确认当前的版本号
    version = Common.get_pandas_ver(os.path.abspath(project_slndir), 'v')

    Message.ShowStatus('正在准备生成 {model} - {lang} 的打包目录...'.format(
        model = '复兴后(RE)' if renewal else '复兴前(PRE)',
        lang = langinfo['name']
    ))

    # 构建解压的打包目录
    packagedir = '../Release/Pandas/{version}/Pandas_{version}_{timestamp}_{model}_{lang}'.format(
        version = version, model = 'RE' if renewal else 'PRE',
        timestamp = Common.timefmt(True), lang = langinfo['dirname']
    )

    # 获取压缩文件的保存路径
    zipfilename = os.path.abspath(project_slndir + packagedir) + '.zip'

    # 获取打包的绝对路径
    packagedir = os.path.abspath(project_slndir + packagedir) + os.path.sep
    
    # 确保目标文件夹存在
    os.makedirs(os.path.dirname(packagedir), exist_ok = True)
    
    # 若之前目录已经存在, 先删掉
    if os.path.exists(packagedir) and os.path.isdir(packagedir):
        shutil.rmtree(packagedir)
    
    # 将 zip 文件解压到指定的目录中去
    Message.ShowStatus('正在解压归档文件到: %s' % os.path.relpath(
        packagedir, os.path.abspath(os.path.join(packagedir, r'../../'))
    ))
    if not zip_unpack(export_file, packagedir):
        clean(export_file)
        Message.ShowError('很抱歉, 解压归档文件失败, 程序终止.')
        Common.exit_with_pause(-1)
    
    # 进行文本的翻译工作
    trans.process(packagedir, langinfo['trans'], True)
    
    # 进行后期处理
    Message.ShowStatus('正在对打包源目录进行后期处理...')
    if renewal:
        arrange_renewal(packagedir)
    else:
        arrange_pre_renewal(packagedir)
    Message.ShowStatus('后期处理完毕, 即将把打包源压缩成 ZIP 文件...')
    
    # 执行打包操作
    if not zip_pack(packagedir, zipfilename):
        clean(export_file)
        Message.ShowError('打包成 zip 文件时失败了, 请联系开发者协助定位问题, 程序终止.')
        Common.exit_with_pause(-1)

    Message.ShowStatus('已成功构建 {model} - {lang} 的压缩文件.'.format(
        model = '复兴后(RE)' if renewal else '复兴前(PRE)',
        lang = langinfo['name']
    ))
コード例 #3
0
    def __searchMark(self, filename):
        line_num = 0
        charset = self.__detectCharset(filename)
        regex = r'\s*?' + self.__options__['mark_format'] + r'\s*?'

        if '../../src/'.replace('/', os.path.sep) in filename and charset.upper() != 'UTF-8-SIG':
            Message.ShowWarning('期望文件 %s 的编码为 UTF-8-SIG 而实际上是 %s' % (filename, charset.upper()))
            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:
                    Message.ShowError('发现重复的代码注入标记: ' + re_match.group(0))
                    Common.exit_with_pause(-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:
            Message.ShowError('文件 : %s | 错误信息 : %s' % (filename, err))
コード例 #4
0
ファイル: pyhelp_compile.py プロジェクト: linhan85/Pandas
def update_symstore():
    if not Common.is_dir_exists(project_symstoredir):
        print('')
        if not Inputer().requireBool({
            'tips' : '本机尚未克隆最新的符号仓库, 是否立刻进行克隆?',
            'default' : False
        }):
            Message.ShowStatus('您主动放弃了继续操作')
            Common.exit_with_pause(-1)

        git.Repo.clone_from(symbols_giturl, project_symstoredir)
    else:
        repo = git.Repo(project_symstoredir)
        if not repo.is_dirty() and not repo.untracked_files:
            Message.ShowStatus('正在尝试拉取最新的符号数据...')
            try:
                repo.remotes.origin.pull()
            except git.GitError as _err:
                Message.ShowWarning('符号数据更新失败: %s' % _err)
            else:
                Message.ShowStatus('符号数据更新成功.')
        else:
            print('')
            if Inputer().requireBool({
                'tips' : '本地符号仓库的工作区不干净, 是否重置工作区?',
                'default' : False
            }):
                repo.git.reset('--hard')
                repo.git.clean('-xdf')
                Message.ShowStatus('已成功重置本地符号仓库到干净状态.')
            else:
                Message.ShowWarning('本地符号仓库工作区不干净, 放弃更新符号数据..')
            print('')
コード例 #5
0
ファイル: pyhelp_compile.py プロジェクト: lth1986/Pandas
def compile_renewal(version):
    '''
    编译复兴后版本
    '''
    time.sleep(3)
    print('')
    
    define_options = {}

    if os.getenv("DEFINE_CRASHRPT_APPID"):
        define_options["CRASHRPT_APPID"] = '\\"%s\\"' % os.getenv("DEFINE_CRASHRPT_APPID")
    if os.getenv("DEFINE_CRASHRPT_PUBLICKEY"):
        define_options["CRASHRPT_PUBLICKEY"] = '\\"%s\\"' % os.getenv("DEFINE_CRASHRPT_PUBLICKEY")

    define_options["GIT_BRANCH"] = '\\"%s\\"' % Common.get_pandas_branch(project_slndir)
    define_options["GIT_HASH"] = '\\"%s\\"' % Common.get_pandas_hash(project_slndir)

    define_values = define_builder(define_options)
    
    if not compile_sub(define_values, '复兴后', version):
        Message.ShowError('编译复兴前版本时发生了一些错误, 请检查...')
        Common.exit_with_pause(-1)
    
    # 将之前 compile_prere 中临时重命名的复兴前产物全部改回正常的文件名
    shutil.move(slndir('login-server-pre-t.exe'), slndir('login-server-pre.exe'))
    shutil.move(slndir('login-server-pre-t.pdb'), slndir('login-server-pre.pdb'))
    shutil.move(slndir('char-server-pre-t.exe'), slndir('char-server-pre.exe'))
    shutil.move(slndir('char-server-pre-t.pdb'), slndir('char-server-pre.pdb'))
    shutil.move(slndir('map-server-pre-t.exe'), slndir('map-server-pre.exe'))
    shutil.move(slndir('map-server-pre-t.pdb'), slndir('map-server-pre.pdb'))
    
    print('')
コード例 #6
0
def main():
    os.chdir(os.path.split(os.path.realpath(__file__))[0])

    Common.welcome('脚本指令添加助手')

    options = {
        'source_dirs':
        '../../src',
        'process_exts': ['.hpp', '.cpp'],
        'mark_format':
        r'// PYHELP - SCRIPTCMD - INSERT POINT - <Section (\d{1,2})>',
        'mark_enum':
        InjectPoint,
        'mark_configure': [{
            'id': InjectPoint.PANDAS_SWITCH_DEFINE,
            'desc': 'pandas.hpp @ 宏定义'
        }, {
            'id': InjectPoint.SCRIPT_BUILDIN_FUNC,
            'desc': 'script.cpp @ BUILDIN_FUNC 脚本指令实际代码'
        }, {
            'id': InjectPoint.SCRIPT_BUILDIN_DEF,
            'desc': 'script.cpp @ BUILDIN_DEF 脚本指令导出'
        }]
    }

    guide(Injecter(options))
    Common.exit_with_pause()
コード例 #7
0
ファイル: pyhelp_compile.py プロジェクト: lth1986/Pandas
def compile_prere(version):
    '''
    编译复兴前版本
    '''
    time.sleep(3)
    print('')
    
    define_options = {
        "PRERE": ""
    }
    
    if os.getenv("DEFINE_CRASHRPT_APPID"):
        define_options["CRASHRPT_APPID"] = '\\"%s\\"' % os.getenv("DEFINE_CRASHRPT_APPID")
    if os.getenv("DEFINE_CRASHRPT_PUBLICKEY"):
        define_options["CRASHRPT_PUBLICKEY"] = '\\"%s\\"' % os.getenv("DEFINE_CRASHRPT_PUBLICKEY")
        
    define_options["GIT_BRANCH"] = '\\"%s\\"' % Common.get_pandas_branch(project_slndir)
    define_options["GIT_HASH"] = '\\"%s\\"' % Common.get_pandas_hash(project_slndir)

    define_values = define_builder(define_options)
    
    if not compile_sub(define_values, '复兴前', version):
        Message.ShowError('编译复兴前版本时发生了一些错误, 请检查...')
        Common.exit_with_pause(-1)

    # 将复兴前版本的编译产物重命名一下, 避免编译复兴后版本时被覆盖
	# 因 ab7a827 的修改每次清理工程时, 也会同时清理复兴前的编译产物, 所以这里需要临时重命名
    shutil.move(slndir('login-server.exe'), slndir('login-server-pre-t.exe'))
    shutil.move(slndir('login-server.pdb'), slndir('login-server-pre-t.pdb'))
    shutil.move(slndir('char-server.exe'), slndir('char-server-pre-t.exe'))
    shutil.move(slndir('char-server.pdb'), slndir('char-server-pre-t.pdb'))
    shutil.move(slndir('map-server.exe'), slndir('map-server-pre-t.exe'))
    shutil.move(slndir('map-server.pdb'), slndir('map-server-pre-t.pdb'))
    
    print('')
コード例 #8
0
def compile_renewal(version):
    '''
    编译复兴后版本
    '''
    time.sleep(3)
    print('')

    define_options = {}

    if os.getenv("DEFINE_CRASHRPT_APPID"):
        define_options["CRASHRPT_APPID"] = '_CT(\\"%s\\")' % os.getenv(
            "DEFINE_CRASHRPT_APPID")
    if os.getenv("DEFINE_CRASHRPT_PUBLICKEY"):
        define_options["CRASHRPT_PUBLICKEY"] = '_CT(\\"%s\\")' % os.getenv(
            "DEFINE_CRASHRPT_PUBLICKEY")

    define_options["GIT_BRANCH"] = '\\"%s\\"' % Common.get_pandas_branch(
        project_slndir)
    define_options["GIT_HASH"] = '\\"%s\\"' % Common.get_pandas_hash(
        project_slndir)

    define_values = define_builder(define_options)

    if not compile_sub(define_values, '复兴后', version):
        Message.ShowError('编译复兴前版本时发生了一些错误, 请检查...')
        Common.exit_with_pause(-1)

    print('')
コード例 #9
0
ファイル: imple_versions.py プロジェクト: aicaac/Pandas
def main():
    os.chdir(os.path.split(os.path.realpath(__file__))[0])

    Common.welcome('版本号修改辅助脚本')

    print('')

    # 读取当前的 Pandas 主程序版本号
    pandas_ver = Common.get_pandas_ver(os.path.abspath(project_slndir),
                                       origin=True)
    Message.ShowInfo('当前模拟器的主版本是 %s' % pandas_ver)

    print('')

    # 询问获取升级后的目标版本
    newver = Inputer().requireText(
        {'tips': '请输入新的版本号 (四段式: 1.0.0.1, 最后一段为 1 则表示为开发版)'})

    if not isVersionFormatValid(newver):
        Message.ShowError('你输入的版本号: %s 不符合四段式规则, 请重试...' % newver)
        Common.exit_with_pause(-1)

    # 执行更新操作
    ver = VersionUpdater(options)
    ver.updateDirectory(slndir('src'), newver)

    Common.exit_with_pause()
コード例 #10
0
def main():
    os.chdir(os.path.split(os.path.realpath(__file__))[0])

    Common.welcome('战斗配置选项添加助手')

    options = {
        'source_dirs' : ['../../src', '../../conf/battle'],
        'process_exts' : ['.hpp', '.cpp', '.conf'],
        'mark_format' : r'// PYHELP - BATTLECONFIG - INSERT POINT - <Section (\d{1,2})>',
        'mark_enum': InjectPoint,
        'mark_configure' : [
            {
                'id' : InjectPoint.PANDAS_SWITCH_DEFINE,
                'desc' : 'pandas.hpp @ 宏定义'
            },
            {
                'id' : InjectPoint.BATTLE_VAR_DEFINE,
                'desc' : 'battle.hpp @ 战斗配置选项的变量声明'
            },
            {
                'id' : InjectPoint.BATTLE_DEFAULT_DEFINE,
                'desc' : 'battle.cpp @ 战斗配置选项的关联和默认值配置'
            },
            {
                'id' : InjectPoint.PANDAS_CONF_INSERT,
                'desc' : 'pandas.conf @ 战斗配置选项的默认添加位置'
            }
        ]
    }

    guide(Injecter(options))
    Common.exit_with_pause()
コード例 #11
0
ファイル: InputController.py プロジェクト: luwenhaov5/Pandas
    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.exit_with_pause(-1)

        user_select = int(user_select)

        if user_select < 0 or user_select >= len(select_data):
            Message.ShowError('您输入了无效的地图标记类型, 程序终止')
            print('-' * 70)
            Common.exit_with_pause(-1)

        print('')
        Message.ShowInfo('您选择的是: %s' % select_data[user_select]['name'])
        print('-' * 70)
        print('')
        return user_select
コード例 #12
0
def process(project_dir, lang='zh-cn', silent=False):
    try:
        for v in configures:
            operate_params = v['operate_params']
            operate_params['lang'] = lang
            operate_params['project_dir'] = project_dir
            operate_params['silent'] = silent
            operate = globals()[v['operate']](**operate_params)

            if 'filepath' in v:
                for path in v['filepath']:
                    fullpath = os.path.abspath(project_dir + path)
                    operate.execute(fullpath)

            if 'globpath' in v:
                for path in v['globpath']:
                    files = glob.glob(os.path.abspath(project_dir + path),
                                      recursive=True)
                    for x in files:
                        relpath = os.path.relpath(x, project_dir).replace(
                            '\\', '/')
                        is_exclude = False
                        if 'globexclude' in v:
                            for e in v['globexclude']:
                                if e in relpath:
                                    is_exclude = True
                                    break
                        if not is_exclude:
                            operate.execute(x)
    except Exception as _err:
        Message.ShowError(str(_err))
        Common.exit_with_pause(-1)
コード例 #13
0
    def __init__(self, options):
        self.__options__ = options
        self.mark_dict = {}

        if not self.detect(self.__options__['source_dirs']):
            Message.ShowError('无法成功定位所有需要的代码注入点, 程序终止!')
            Common.exit_with_pause(-1)
        else:
            Message.ShowStatus('已成功定位所有代码注入点.\n')
コード例 #14
0
def main():
    os.chdir(os.path.split(os.path.realpath(__file__))[0])

    Common.welcome('地图标记添加助手')

    options = {
        'source_dirs' : '../../src',
        'process_exts' : ['.hpp', '.cpp'],
        'mark_format' : r'// PYHELP - MAPFLAG - INSERT POINT - <Section (\d{1,2})>',
        'mark_enum': InjectPoint,
        'mark_configure' : [
            {
                'id' : InjectPoint.PANDAS_SWITCH_DEFINE,
                'desc' : 'pandas.hpp @ 宏定义'
            },
            {
                'id' : InjectPoint.MAP_MAPFLAG_DEFINE,
                'desc' : 'map.hpp @ MF_XXX 常量定义'
            },
            {
                'id' : InjectPoint.SCRIPT_CONSTANTS_EXPORT,
                'desc' : 'script_constants.hpp @ MF_XXX 常量导出'
            },
            {
                'id' : InjectPoint.ATCOMMAND_MAPFLAG_BLOCK,
                'desc' : 'atcommand.cpp @ mapflag GM指令的赋值屏蔽处理'
            },
            {
                'id' : InjectPoint.MAP_GETMAPFLAG_SUB,
                'desc' : 'map.cpp @ map_getmapflag_sub 的读取标记处理'
            },
            {
                'id' : InjectPoint.MAP_SETMAPFLAG_SUB,
                'desc' : 'map.cpp @ map_setmapflag_sub 的设置标记处理'
            },
            {
                'id' : InjectPoint.NPC_PARSE_MAPFLAG,
                'desc' : 'npc.cpp @ npc_parse_mapflag 可选的标记处理'
            },
            {
                'id' : InjectPoint.ATCOMMAND_MAPINFO,
                'desc' : 'atcommand.cpp @ ACMD_FUNC(mapinfo) 可选的地图信息输出'
            },
            {
                'id' : InjectPoint.SCRIPT_SETMAPFLAG,
                'desc' : 'script.cpp @ setmapflag 可选的脚本设置标记参数处理代码'
            },
            {
                'id' : InjectPoint.SCRIPT_GETMAPFLAG,
                'desc' : 'script.cpp @ getmapflag 可选的脚本读取标记参数处理代码'
            }
        ]
    }

    guide(Injecter(options))
    Common.exit_with_pause()
コード例 #15
0
 def requireInt(self, options):
     print('-' * 70)
     Message.ShowSelect(options['tips'] + ':')
     result = input(options['prefix']) if 'prefix' in options else input()
     if not result:
         if not ('allow_empty' in options and options['allow_empty']):
             Message.ShowError('请至少输入一个数字. 程序终止')
             print('-' * 70)
             Common.exit_with_pause(-1)
         result = '0'
     if not result.isdigit():
         Message.ShowError('请输入一个数字而不是字符串. 程序终止')
         print('-' * 70)
         Common.exit_with_pause(-1)
     Message.ShowInfo('您输入的是: ' + result)
     print('-' * 70)
     print('')
     return int(result)
コード例 #16
0
def main():
    # 加载 .env 中的配置信息
    load_dotenv(dotenv_path='.config.env', encoding='UTF-8')

    # 若无配置信息则自动复制一份文件出来
    if not Common.is_file_exists('.config.env'):
        shutil.copyfile('.config.env.sample', '.config.env')

    # 显示欢迎信息
    Common.welcome('格式化占位符检查辅助脚本')
    print('')

    # 执行检查工作
    for i in entrance_configure:
        do_check_file(os.path.abspath(project_slndir + i))

    # 友好退出, 主要是在 Windows 环境里给予暂停
    Common.exit_with_pause()
コード例 #17
0
def main():
    Common.welcome('终端翻译对照表提取助手')

    options = [{
        'name': '建立新的翻译对照表文件',
        'desc': '0 - 建立新的翻译对照表文件'
    }, {
        'name': '更新现有的翻译对照表文件',
        'desc': '1 - 更新现有的翻译对照表文件'
    }, {
        'name': '基于简体中文汉化结果更新繁体中文数据',
        'desc': '2 - 基于简体中文汉化结果更新繁体中文数据'
    }]

    userchoose = Inputer().requireSelect({
        'prompt': '想要执行的操作或任务',
        'option_name': '操作或任务',
        'data': options
    })

    if userchoose == 1:
        updatever = Inputer().requireBool({
            'tips': '完成更新后是否提升数据版本号?',
            'default': False
        })

    extracter = TranslationExtracter()

    if userchoose == 0:
        extracter.build(project_slndir + 'src')
        extracter.dump('translation.yml')
    elif userchoose == 1:
        extracter.build(project_slndir + 'src')
        extracter.updateall(updatever)
    elif userchoose == 2:
        extracter.load(project_slndir + 'conf/msg_conf/translation_cn.yml')
        extracter.toTraditional()
        extracter.dump(project_slndir + 'conf/msg_conf/translation_tw.yml')

    Common.exit_with_pause()
コード例 #18
0
 def requireText(self, options):
     print('-' * 70)
     Message.ShowSelect(options['tips'] + ':')
     prefix_val = options['prefix'] if 'prefix' in options else ''
     result = input(prefix_val)
     if not result:
         if 'default' in options and options['default']:
             result = options['default']
         if not result and not ('allow_empty' in options
                                and options['allow_empty']):
             Message.ShowError('请至少输入一个字符. 程序终止')
             print('-' * 70)
             Common.exit_with_pause(-1)
     result = prefix_val + result
     if 'upper' in options and options['upper']:
         result = result.upper()
     if 'lower' in options and options['lower']:
         result = result.lower()
     Message.ShowInfo('您输入的是: ' + result)
     print('-' * 70)
     print('')
     return result
コード例 #19
0
ファイル: imple_versions.py プロジェクト: aicaac/Pandas
    def versionFormat(self, version, vmode):
        ver_fields = []
        if '.' in version:
            ver_fields = version.split('.')
        elif ',' in version:
            ver_fields = version.split(',')
        else:
            Message.ShowError('您传入的版本号格式不正确: %s' % version)
            Common.exit_with_pause(-1)

        if vmode == '.':
            return '.'.join(ver_fields)
        elif vmode == ',':
            return ','.join(ver_fields)
        elif vmode == 'fmt':
            return 'v%s.%s.%s%s' % (ver_fields[0], ver_fields[1],
                                    ver_fields[2],
                                    '-dev' if ver_fields[3] == '1' else '')
        else:
            Message.ShowError('您传入的 vmode 版本号格式不正确: %s' % vmode)
            Common.exit_with_pause(-1)

        return version
コード例 #20
0
def main():
    '''
    主入口函数
    '''
    Common.welcome('游戏文本转译辅助脚本')

    langtype = Inputer().requireSelect({
        'prompt':
        '需要将文本翻译成的目标语言类型',
        'option_name':
        '目标语言',
        'data': [{
            'name': '简体中文',
            'desc': '0 - 汉化成简体中文'
        }, {
            'name': '繁体中文',
            'desc': '1 - 汉化成繁体中文'
        }]
    })

    process(project_slndir, 'zh-cn' if langtype == 0 else 'zh-tw')

    Common.exit_with_pause()
コード例 #21
0
def main():
    os.chdir(os.path.split(os.path.realpath(__file__))[0])

    Common.welcome('源代码文件编码转换助手')
    print('')

    confirm = Inputer().requireBool({
        'tips': '是否立刻进行文件编码转换?',
        'default': False
    })

    if not confirm:
        Message.ShowInfo('您取消了操作, 程序终止...\n')
        Common.exit_with_pause()

    count = CharsetConverter({
        'ignore_files': ['Makefile', 'Makefile.in', 'CMakeLists.txt'],
        'process_exts': ['.hpp', '.cpp', '.h', '.c']
    }).convertDirectory('../../src', 'UTF-8-SIG')

    if count <= 0:
        Message.ShowInfo('很好! 源代码文件都已转换为 UTF-8-SIG 编码.')

    Common.exit_with_pause()
コード例 #22
0
def compile_prere(version):
    '''
    编译复兴前版本
    '''
    time.sleep(3)
    print('')

    define_options = {"PRERE": ""}

    if os.getenv("DEFINE_CRASHRPT_APPID"):
        define_options["CRASHRPT_APPID"] = '\\"%s\\"' % os.getenv(
            "DEFINE_CRASHRPT_APPID")
    if os.getenv("DEFINE_CRASHRPT_PUBLICKEY"):
        define_options["CRASHRPT_PUBLICKEY"] = '\\"%s\\"' % os.getenv(
            "DEFINE_CRASHRPT_PUBLICKEY")

    define_options["GIT_BRANCH"] = '\\"%s\\"' % Common.get_pandas_branch(
        project_slndir)
    define_options["GIT_HASH"] = '\\"%s\\"' % Common.get_pandas_hash(
        project_slndir)

    define_values = define_builder(define_options)

    if not compile_sub(define_values, '复兴前', version):
        Message.ShowError('编译复兴前版本时发生了一些错误, 请检查...')
        Common.exit_with_pause(-1)

    # 将复兴前版本的编译产物重命名一下, 避免编译复兴后版本时被覆盖

# 因 ab7a827 的修改每次清理工程时, 也会同时清理复兴前的编译产物, 所以这里需要临时重命名
    if 're' in os.getenv('DEFINE_COMPILE_MODE').split(','):
        move_product_files('', '-pre-t')
    else:
        move_product_files('', '-pre')

    print('')
コード例 #23
0
ファイル: pyhelp_publish.py プロジェクト: lth1986/Pandas
def main():
    '''
    主入口函数
    '''
    # 显示欢迎信息
    Common.welcome('打包流程辅助脚本')
    print('')

    pandas_ver = Common.get_pandas_ver(os.path.abspath(project_slndir))
    Message.ShowInfo('当前模拟器的主版本是 %s' % pandas_ver)

    # 检查是否已经完成了编译
    if not Common.is_compiled(project_slndir):
        Message.ShowWarning('检测到打包需要的编译产物不完整, 请重新编译. 程序终止.')
        print('')
        Common.exit_with_pause(-1)

    # 导出当前仓库, 变成一个归档压缩文件
    Message.ShowInfo('正在将当前分支的 HEAD 内容导出成归档文件...')
    export_file = export()
    if not export_file:
        Message.ShowError('很抱歉, 导出归档文件失败, 程序终止.')
        Common.exit_with_pause(-1)
    Message.ShowInfo('归档文件导出完成, 此文件将在程序结束时被删除.') 

    # 基于归档压缩文件, 进行打包处理
    process(export_file, renewal=True)
    process(export_file, renewal=False)

    # 执行一些清理工作
    clean(export_file)

    print('')
    Message.ShowInfo('已经成功打包相关文件, 请进行人工核验.')

    # 友好退出, 主要是在 Windows 环境里给予暂停
    Common.exit_with_pause()
コード例 #24
0
ファイル: dawn_compile.py プロジェクト: aicaac/Pandas
def main():
    '''
    主入口函数
    '''
    # 加载 .env 中的配置信息
    load_dotenv(dotenv_path='.config.env', encoding='UTF-8')

    # 若无配置信息则自动复制一份文件出来
    if not Common.is_file_exists('.config.env'):
        shutil.copyfile('.config.env.sample', '.config.env')

    # 显示欢迎信息
    Common.welcome('编译流程辅助脚本')

    # 只能在 Windows 环境运行
    if platform.system() != 'Windows':
        Message.ShowError('很抱歉, 此脚本只能在 Windows 环境上运行')
        Common.exit_with_pause(-1)

    # 判断本机是否安装了支持的 Visual Studio
    detected_vs, vs_name = detect_vs()
    if not detected_vs:
        Message.ShowError('无法检测到合适的 Visual Studio 版本 (2015 或 2017)')
        Common.exit_with_pause(-1)
    else:
        Message.ShowStatus('检测到已安装: %s 应可正常编译' % vs_name)

    print('')

    # 读取当前的 Pandas 主程序版本号
    pandas_ver = Common.get_pandas_ver(os.path.abspath(project_slndir))
    Message.ShowInfo('当前模拟器的主版本是 %s' % pandas_ver)

    # 判断是否已经写入了对应的更新日志, 若没有则要给予提示再继续
    if (has_changelog(pandas_ver)):
        Message.ShowStatus('已经在更新日志中找到了 %s 的版本信息.' % pandas_ver)
    else:
        Message.ShowWarning('没有在更新日志中找到 %s 版本的信息, 请注意完善!' % pandas_ver)

    # 判断当前 git 工作区是否干净, 若工作区不干净要给予提示
    if git.Repo(project_slndir).is_dirty():
        if not Inputer().requireBool({
                'tips': '当前模拟器代码仓库的工作区不干净, 要继续编译吗?',
                'default': False
        }):
            Message.ShowStatus('您主动放弃了继续操作')
            Common.exit_with_pause(-1)
    else:
        Message.ShowStatus('当前模拟器代码仓库的工作区是干净的.')

    # 检查 Crashrpt 使用的信息是否都设置好了, 若没有且企图编译正式版, 则给与提示
    if Common.is_pandas_release(os.path.abspath(project_slndir)):
        if not os.getenv("DEFINE_CRASHRPT_APPID"):
            Message.ShowWarning('当前并未设置 AppID, 且企图编译正式版.')
            Common.exit_with_pause(-1)
        if Common.md5(os.getenv("DEFINE_CRASHRPT_APPID")
                      ) != '952648de2d8f063a07331ae3827bc406':
            Message.ShowWarning('当前已设置了 AppID, 但并非正式版使用的 AppID.')
            Common.exit_with_pause(-1)
        if not os.getenv("DEFINE_CRASHRPT_PUBLICKEY"):
            Message.ShowWarning('当前并未设置 PublicKey, 且企图编译正式版.')
            Common.exit_with_pause(-1)

    Message.ShowStatus('即将开始编译, 编译速度取决于电脑性能, 请耐心...')

    # 清理目前的工作目录, 把一些可明确移除的删掉
    clean_environment()

    # 编译 Pandas 的复兴前版本
    compile_prere(pandas_ver)

    # 编译 Pandas 的复兴后版本
    compile_renewal(pandas_ver)

    Message.ShowStatus('编译工作已经全部结束, 请归档符号并执行打包流程.')

    # 友好退出, 主要是在 Windows 环境里给予暂停
    Common.exit_with_pause()
コード例 #25
0
ファイル: pyhelp_symstore.py プロジェクト: lth1986/Pandas
def main():
    # 显示欢迎信息
    Common.welcome('符号归档辅助脚本')
    print('')
    
    # 检查是否已经完成了编译
    if not Common.is_compiled(project_slndir):
        Message.ShowWarning('检测到打包需要的编译产物不完整, 请重新编译. 程序终止.')
        Common.exit_with_pause(-1)

    # 检查符号仓库是否存在, 不存在则创建
    if not ensure_store():
        Message.ShowWarning('你放弃了拉取符号仓库, 后续工作无法继续. 程序终止.')
        Common.exit_with_pause(-1)
    else:
        Message.ShowStatus('符号仓库已经存在于本地, 开始确认工作区状态...')

    # 若符号文件存在, 则确保工作区干净
    if not ensure_store_clean():
        Message.ShowWarning('为了防止出现意外, 请确保符号仓库的工作区是干净的. 程序终止.')
        Common.exit_with_pause(-1)
    else:
        Message.ShowStatus('很好, 符号仓库的工作区是干净的.')
    
    # 尝试更新本地的符号仓库到最新
    if not update_store():
        Message.ShowWarning('为了防止出现意外, 请确保符号仓库同步到最新. 程序终止.')
        Common.exit_with_pause(-1)
    else:
        Message.ShowStatus('符号仓库已经同步到最新, 开始归档新的符号文件...')

    # 搜索工程目录全部 pdb 文件和 exe 文件, 进行归档
    deploy_symbols(project_slndir)
    
    # 自动进行 git 提交操作
    Message.ShowStatus('归档完毕, 正在提交...')
    if not make_commit():
        Message.ShowWarning('很抱歉, 提交失败! 请确认失败的原因. 程序终止.')
        Common.exit_with_pause(-1)
    else:
        Message.ShowStatus('提交成功, 请手工推送到远程仓库.')
    
    # 友好退出, 主要是在 Windows 环境里给予暂停
    Common.exit_with_pause()
コード例 #26
0
ファイル: dawn_publish.py プロジェクト: CairoLee/Pandas
def main():
    '''
    主入口函数
    '''
    # 加载 .env 中的配置信息
    load_dotenv(dotenv_path='.config.env', encoding='UTF-8')

    # 若无配置信息则自动复制一份文件出来
    if not Common.is_file_exists('.config.env'):
        shutil.copyfile('.config.env.sample', '.config.env')

    # 显示欢迎信息
    Common.welcome('打包流程辅助脚本')
    print('')

    pandas_ver = Common.get_pandas_ver(os.path.abspath(project_slndir))
    Message.ShowInfo('当前模拟器的主版本是 %s' % pandas_ver)

    # 若环境变量为空则设置个默认值
    if not os.getenv('DEFINE_PROJECT_NAME'):
        os.environ["DEFINE_PROJECT_NAME"] = "Pandas"

    if not os.getenv('DEFINE_COMPILE_MODE'):
        os.environ["DEFINE_COMPILE_MODE"] = "re,pre"

    Message.ShowInfo('当前输出的项目名称为: %s' % os.getenv('DEFINE_PROJECT_NAME'))

    # 检查是否已经完成了编译
    if 're' in os.getenv('DEFINE_COMPILE_MODE').split(','):
        if not Common.is_compiled(project_slndir, checkmodel='re'):
            Message.ShowWarning('检测到打包需要的编译产物不完整, 请重新编译. 程序终止.')
            print('')
            Common.exit_with_pause(-1)

    if 'pre' in os.getenv('DEFINE_COMPILE_MODE').split(','):
        if not Common.is_compiled(project_slndir, checkmodel='pre'):
            Message.ShowWarning('检测到打包需要的编译产物不完整, 请重新编译. 程序终止.')
            print('')
            Common.exit_with_pause(-1)

    # 导出当前仓库, 变成一个归档压缩文件
    Message.ShowInfo('正在将当前分支的 HEAD 内容导出成归档文件...')
    export_file = export()
    if not export_file:
        Message.ShowError('很抱歉, 导出归档文件失败, 程序终止.')
        Common.exit_with_pause(-1)
    Message.ShowInfo('归档文件导出完成, 此文件将在程序结束时被删除.')

    # 基于归档压缩文件, 进行打包处理
    if 're' in os.getenv('DEFINE_COMPILE_MODE').split(','):
        process(export_file, renewal=True)

    if 'pre' in os.getenv('DEFINE_COMPILE_MODE').split(','):
        process(export_file, renewal=False)

    # 执行一些清理工作
    clean(export_file)

    print('')
    Message.ShowInfo('已经成功打包相关文件, 请进行人工核验.')

    # 友好退出, 主要是在 Windows 环境里给予暂停
    Common.exit_with_pause()
コード例 #27
0
def guide(inject):

    define = Inputer().requireText({
        'tips' : '请输入该战斗配置选项的宏定义开关名称 (Pandas_BattleConfig_的末尾部分)',
        'prefix' : 'Pandas_BattleConfig_'
    })
    
    # --------
    
    option_name = Inputer().requireText({
        'tips' : '请输入该战斗配置选项的选项名称'
    })
    
    # --------
    
    var_name = Inputer().requireText({
        'tips' : '请输入该战斗配置选项的变量名称 (不填默认与选项名称一致)',
        'default' : option_name.replace('.', '_')
    })
    
    # --------
    
    def_val = Inputer().requireInt({
        'tips' : '请输入默认值 (不填则默认为 0)',
		'allow_empty' : True
    })
    
    # --------
    
    min_val = Inputer().requireInt({
        'tips' : '请输入允许设置的最小值 (不填则默认为 0)',
		'allow_empty' : True
    })
    
    # --------
    
    max_val = Inputer().requireInt({
        'tips' : '请输入允许设置的最大值 (不填则默认为 INT_MAX)',
		'allow_empty' : True
    })
    
    if max_val == 0:
        max_val = 2147483647
    
    if max_val <= min_val:
        Message.ShowError('最大值比最小值还要小, 这不合理...')
        Common.exit_with_pause(-1)
    
    def_val = str(def_val)
    min_val = str(min_val)
    max_val = 'INT_MAX' if max_val == 2147483647 else str(max_val)
    
    # --------
    
    print('-' * 70)
    Message.ShowInfo('请确认建立的信息, 确认后将开始修改代码.')
    print('-' * 70)
    Message.ShowInfo('开关名称 : %s' % define)
    Message.ShowInfo('选项名称 : %s' % option_name)
    Message.ShowInfo('变量名称 : %s' % var_name)
    print('')
    Message.ShowInfo('选项默认值 : %s' % def_val)
    Message.ShowInfo('选项最小值 : %s' % min_val)
    Message.ShowInfo('选项最大值 : %s' % max_val)
    print('-' * 70)
    print('\n')

    nextstep = Inputer().requireBool({
        'tips' : '请仔细阅读上述信息, 确认要开始写入操作么?',
        'default' : False
    })

    if not nextstep:
        Message.ShowStatus('终止写入操作, 程序终止')
        Common.exit_with_pause(-1)
    
    # --------
    
    Message.ShowStatus('开始将战斗配置选项写入到源代码...')
    
    options = {
        'define' : define,
        'option_name' : option_name,
        'var_name' : var_name,
        'def_val' : def_val,
        'min_val' : min_val,
        'max_val' : max_val
    }
    
    insert_battle_config(inject, options)
    
    Message.ShowStatus('已经成功写入到源代码, 请检查并完善必要的注释.')
    print('')
    print('=' * 70)
    print('')
    print('感谢您的使用, 战斗配置选项添加助手已经执行完毕'.center(50))
    print('')
    print('=' * 70)
コード例 #28
0
def guide(inject):

    define = Inputer().requireText({
        'tips': '请输入该脚本指令的宏定义开关名称 (Pandas_ScriptCommand_的末尾部分)',
        'prefix': 'Pandas_ScriptCommand_'
    })

    # --------

    funcname = Inputer().requireText({
        'tips': '请输入该脚本指令的处理函数名称 (BUILDIN_FUNC 部分的函数名)',
        'lower': True
    })

    # --------

    samefunc = Inputer().requireBool({
        'tips': '脚本指令是否与处理函数名称一致 (%s)?' % funcname,
        'default': True
    })

    # --------

    cmdname = funcname
    if not samefunc:
        cmdname = Inputer().requireText({
            'tips': '请输入该脚本指令的名称 (BUILDIN_DEF2 使用)',
            'lower': True
        })

    # --------

    argsmode = Inputer().requireText({
        'tips': r'请输入该脚本指令的参数模式 (如一个或多个的: i\s\? 为空则直接回车)',
        '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 = Inputer().requireBool({
        'tips': '请仔细阅读上述信息, 确认要开始写入操作么?',
        'default': False
    })

    if not nextstep:
        Message.ShowStatus('终止写入操作, 程序终止')
        Common.exit_with_pause(-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)
コード例 #29
0
ファイル: create_mapflag.py プロジェクト: aicaac/Pandas
def guide(inject):

    define = Inputer().requireText({
        'tips': '请输入该地图标记的宏定义开关名称 (Pandas_MapFlag_的末尾部分)',
        'prefix': 'Pandas_MapFlag_'
    })

    # --------

    constant = Inputer().requireText({
        'tips': '请输入该地图标记的 MF 常量名称 (自动大写, MF_的末尾部分)',
        'prefix': 'MF_',
        'upper': True
    })

    # --------

    flaglist = [{
        'name': '普通开关式的地图标记',
        'desc': '0 - 普通的地图标记开关, 只有两个状态(开/关)'
    }, {
        'name': '携带单个数值参数的地图标记',
        'desc': '1 - 携带单个数值参数的地图标记, 可以记录数值变量 (例如 bexp 标记)'
    }]

    # flagtype = 0  # 0 为普通开关 | 1 为数值开关
    flagtype = Inputer().requireSelect({
        'prompt': '想创建的地图标记类型',
        'option_name': '地图标记类型',
        'data': flaglist
    })

    # --------

    default_val = 0
    if flagtype == 1:
        default_val = Inputer().requireInt({
            'tips': '请输入"第一个数值参数"的默认值 (不填则默认为 0)',
            'allow_empty': True
        })

    # --------

    default_disable = False
    if flagtype == 1:
        default_disable = Inputer().requireBool({
            'tips':
            '当"第一个数值参数"的值为 %d 时, 是否表示移除此地图标记?' % default_val,
            '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('第一个数值参数的默认值 : %d' % default_val)
    Message.ShowInfo('第一个数值参数的值为 %d 时, 是否禁用此标记 : %s' %
                     (default_val, default_disable))
    print('-' * 70)
    print('\n')

    nextstep = Inputer().requireBool({
        'tips': '请仔细阅读上述信息, 确认要开始写入操作么?',
        'default': False
    })

    if not nextstep:
        Message.ShowStatus('终止写入操作, 程序终止')
        Common.exit_with_pause(-1)

    # --------

    Message.ShowStatus('开始将地图标记信息写入到源代码...')

    options = {
        'flagtype': flagtype,
        'define': define,
        'constant': constant,
        'default_val': default_val,
        'default_disable': default_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)
コード例 #30
0
ファイル: pyhelp_compile.py プロジェクト: linhan85/Pandas
def main():
    '''
    主入口函数
    '''
    # 加载 .env 中的配置信息
    load_dotenv(dotenv_path='pyhelp.conf', encoding='UTF-8-SIG')
    
    # 若无配置信息则自动复制一份文件出来
    if not Common.is_file_exists('pyhelp.conf'):
        shutil.copyfile('pyhelp.conf.sample', 'pyhelp.conf')
    
    # 显示欢迎信息
    Common.welcome('编译流程辅助脚本')

    # 只能在 Windows 环境运行
    if platform.system() != 'Windows':
        Message.ShowError('很抱歉, 此脚本只能在 Windows 环境上运行')
        Common.exit_with_pause(-1)

    # 判断本机是否安装了支持的 Visual Studio
    detected_vs, vs_name = detect_vs()
    if not detected_vs:
        Message.ShowError('无法检测到合适的 Visual Studio 版本 (2015 或 2017)')
        Common.exit_with_pause(-1)
    else:
        Message.ShowStatus('检测到已安装: %s 应可正常编译' % vs_name)

    print('')

    # 读取当前的 Pandas 主程序版本号
    pandas_ver = get_pandas_ver()
    Message.ShowInfo('当前模拟器的主版本是 %s' % pandas_ver)

    # 判断是否已经写入了对应的更新日志, 若没有则要给予提示再继续
    if (has_changelog(pandas_ver)):
        Message.ShowStatus('已经在更新日志中找到了 %s 的版本信息.' % pandas_ver)
    else:
        Message.ShowWarning('没有在更新日志中找到 %s 版本的信息, 请注意完善!' % pandas_ver)

    # 检查创建并尝试更新符号仓库
    update_symstore()

    # 判断当前 git 工作区是否干净, 若工作区不干净要给予提示
    if git.Repo(project_slndir).is_dirty():
        if not Inputer().requireBool({
            'tips' : '当前模拟器代码仓库的工作区不干净, 要继续编译吗?',
            'default' : False
        }):
            Message.ShowStatus('您主动放弃了继续操作')
            Common.exit_with_pause(-1)
    else:
        Message.ShowStatus('当前模拟器代码仓库的工作区是干净的.')
    Message.ShowStatus('即将开始编译, 编译速度取决于电脑性能, 请耐心...')

    # 清理目前的工作目录, 把一些可明确移除的删掉
    clean_environment()

    # 编译 Pandas 的复兴前版本
    compile_prere(pandas_ver)

    # 将复兴前版本的编译产物重命名一下, 避免编译复兴后版本时被覆盖
    shutil.move(slndir('login-server.exe'), slndir('login-server-pre.exe'))
    shutil.move(slndir('login-server.pdb'), slndir('login-server-pre.pdb'))
    shutil.move(slndir('char-server.exe'), slndir('char-server-pre.exe'))
    shutil.move(slndir('char-server.pdb'), slndir('char-server-pre.pdb'))
    shutil.move(slndir('map-server.exe'), slndir('map-server-pre.exe'))
    shutil.move(slndir('map-server.pdb'), slndir('map-server-pre.pdb'))

    # 编译 Pandas 的复兴后版本
    print('')
    compile_renewal(pandas_ver)

    print('')
    Message.ShowStatus('编译工作已经全部结束.')
    Message.ShowStatus('编译时产生的符号文件已存储, 记得提交符号文件.\n')

    # 友好退出, 主要是在 Windows 环境里给予暂停
    Common.exit_with_pause(0)