东方骑砍吧 关注:8,664贴子:188,126

txt修改经验分享(适用于各种mod)

只看楼主收藏回复

今天发这个帖子,其实就是想让大家知道骑砍的txt修改并没有那么难(只是为了满足自己的一些小小的需求的话)。我一开始接触这个游戏时也是啥也不会,刚听说魔球,感觉这名字好夸张。。。安装好打开以后,发现界面很友好啊,功能一目了然,相信凭借魔球可以满足我们的很多欲望了。
当然,随着对相关内容的不断深入,很可能有些人会对魔球的局限性感到不足,想要修改更多的东西,这就需要动用txt了(虽然本质是修改py代码)。


IP属地:四川1楼2016-01-29 21:53回复
    2楼目录,慢慢补充。
    此文献给想做mod,又对py这个词天生恐惧的朋友。


    IP属地:四川2楼2016-01-29 21:54
    回复
      2025-08-20 21:47:08
      广告
      不感兴趣
      开通SVIP免广告
      一、利用魔球的触发器翻译,得出兵种、部队、装备的txt码
      首先不得不提到魔球大法啊,这真是一个实用的工具,里面的具体用法我就不多说了。这里只说如何利用魔球的触发器,翻译得到一些经常需要的txt码。
      具体做法:
      魔球中参考任意一个触发器新建一个新的触发器,然后将以下代码复制粘贴进去(仅供参考)。
      (party_add_members,"p_main_party","trp_player",1),
      (spawn_around_party,"p_main_party","pt_forest_Empire_Religious2"),
      (set_item_probability_in_merchandise,"itm_salt", 700),
      这三句py已经涉及到了部队、兵种、部队模板、物品了,在触发结果的“py代码”部分将这些粘贴进去,然后切换到“伪代码”,就可以完成翻译。然后你可以通过右键选择这些元素,进行相应的更换。


      IP属地:四川3楼2016-01-29 21:54
      收起回复
        三、好用的翻译工具
        这里得提到魔球以外的另一个工具,MBCodeEditor。当我们接触了比较多的py语句以后,会发现有些py语句魔球翻译不了,而且会报错,其实这种情况不一定是语句有错,很可能是因为魔球不支持这句py。这种时候,这个软件的作用就大了。
        如图

        先点“browse”选择mod文件夹的路径,选择好以后,点击“load mod”,然后才能进行其它操作。“output as source code”就是把指定的txt文件导出成为py,文件默认导出在mod文件夹内,和那些txt在一起。
        通过阅读py文件可以进步的更快,当然不必心急,刚开始肯定会比较吃力。
        不过我们开始只需要用到翻译功能就行,Module_system_code框里填写py代码,Text_codeL里填写txt代码,就可以互相翻译了。
        注意:这个反编译软件仅用来学习即可,反编译是一种侵害版权的行为,不可用于商业行为。


        IP属地:四川5楼2016-01-29 21:55
        收起回复
          五、修改中常用的txt文件及其简单说明
          1.conversation.txt
          正好上面的例子有些地方讲得不是很透,这里再首先提一下。
          截取前面一小段(#后面跟着的是我自己添加的注释):
          ——————————————————————————
          dialogsfile version 2 #这一行只是声明,没有实际作用
          3874 #大控制字,决定着游戏读取的对话数量
          dlga_spouse_talk:spouse_household_relation 【69631】 【564 0】 {!}like_me. 【6 1】 1 3936748722493063440 14411518807585589220 NO_VOICEOVER #这就是一个完整的对话
          ————————————————————————————
          以dlga_xxxx为开始,到NO_VOICEOVER结束,是一个完整的对话段;
          可以看到我把很多地方加了方括号,这些部分的代码都是没有实际功能的,属于控制字一类。像“dlga_spouse_talk:spouse_household_relation”这一类的则是英文字符串,为了标记这个对话,作用是为了方便汉化;而且,无论是魔球还是mbcodeeditor,都不能翻译控制字和字符串(没错就是这么麻烦)!
          a.这里69631可以当作一个标识符,它可以表示这个对话的双方是谁,例如此句是玩家与领主的对话,此刻是玩家在说话,也就说明了所有玩家与领主的对话中,标识符都是69631。需要注意的是,如果是领主在与玩家说话,标识符则不同,需要另外寻找。
          b.【564 0】和【6 1】也是一种标识符,【564 0】标识的是当前整个对话框,相当于这个对话的ID;【6 1】则是标识的是下一个对话,相当于告诉程序:点完这个对话,接下来出现的对话是哪一句。我们就称564 0为当前标识符、6 1为跳转标识符吧。
          其实可以形象理解一下标识符,公交车上,电子音播放,这一站是564 0,下一站是6 1.
          ——————————————————————————————————————
          为了方便理解,我再从对话中找个例子
          dlga_view_char:choose 66316 【23 1】 150 1288230376151711848 Test. 【3059 0】 NO_VOICEOVER
          dlga_view_char:choose0 4095 【3059 0】 choose0. 【3060 0】 NO_VOICEOVER
          dlga_view_char:choose1 66316 【3060 0】 choose1. 6 3 1541 3 1224979098644774912360287970189639680 0 1530 3 360287970189639680 1224979098644774912 17 1543 3360287970189639680 0 -1 NO_VOICEOVER
          dlga_view_char:choose2 66316 【3060 0】 choose2. 6 3 1541 3 1224979098644774912360287970189639680 1 1530 3 360287970189639680 1224979098644774912 42 1543 3360287970189639680 1 -1 NO_VOICEOVER
          dlga_view_char:choose3 66316 【3060 0】 choose3. 6 3 1541 3 1224979098644774912 3602879701896396802 1530 3 360287970189639680 1224979098644774912 18 1543 3 360287970189639680 2-1 NO_VOICEOVER
          ————————————————————
          这里有5个对话,让我们分析一下:
          第一句dlga_view_char:choose66316 【23 1】 150 1 288230376151711848 Test. 【3059 0】 NO_VOICEOVER
          此句的当前标识符为23 1,跳转标识符为3059 0,也就是告诉我们游戏中点完这个对话选项将要跳转到3059 0为当前标识符的对话;
          恰好下一句dlga_view_char:choose04095 【3059 0】 choose0. 【3060 0】 NO_VOICEOVER,没错,就是跳转到这里了;
          同理再下一句是
          dlga_view_char:choose1 66316 【3060 0】 choose1. 6 3 1541 3 1224979098644774912360287970189639680 0 1530 3 360287970189639680 1224979098644774912 17 1543 3360287970189639680 0 -1 NO_VOICEOVER
          dlga_view_char:choose2 66316 【3060 0】 choose2. 6 3 1541 3 1224979098644774912360287970189639680 1 1530 3 360287970189639680 1224979098644774912 42 1543 3360287970189639680 1 -1 NO_VOICEOVER
          dlga_view_char:choose3 66316 【3060 0】 choose3. 6 3 1541 3 1224979098644774912 3602879701896396802 1530 3 360287970189639680 1224979098644774912 18 1543 3 360287970189639680 2-1 NO_VOICEOVER
          奇怪的是,这次有三句对话的当前标识符为3060 0,这不奇怪,因为游戏中的对话多为并列的多个选项,当前标识符相同,也就说明它们是并列的几个选项。
          ————————————————————————
          那么通过分析,游戏中对话出现的实际顺序就应该是:
          1、dlga_view_char:choose66316 【23 1】 150 1 288230376151711848 Test. 【3059 0】 NO_VOICEOVER
          2、dlga_view_char:choose04095 【3059 0】 choose0. 【3060 0】 NO_VOICEOVER
          3、dlga_view_char:choose166316 【3060 0】 choose1. 【6 3】 1541 31224979098644774912 360287970189639680 0 1530 3 3602879701896396801224979098644774912 17 1543 3 360287970189639680 0 -1 NO_VOICEOVER
          3、dlga_view_char:choose266316 【3060 0】 choose2. 【6 3】 1541 31224979098644774912 360287970189639680 1 1530 3 3602879701896396801224979098644774912 42 1543 3 360287970189639680 1 -1 NO_VOICEOVER
          3、dlga_view_char:choose366316 【3060 0】 choose3. 【6 3】 1541 31224979098644774912 360287970189639680 2 1530 3 3602879701896396801224979098644774912 18 1543 3 360287970189639680 2 -1 NO_VOICEOVER


          IP属地:四川7楼2016-01-29 21:56
          回复
            那么再举两个例子,看看读者能不能找对每个控制字的所在。
            例1
            menu_start_game_3 512 Choose_your_scenario: none 【2】 2133 2144115188075856145 0 2133 2 144115188075856145 144115188075856145 【1】
            mno_go_back 【0】 Go_back 【1】 2055 0 .
            例2
            menu_custom_battle_scene 18374686479671624192 (NO_TRANS)none 【0】【6】
            mno_quick_battle_scene_1 0 {!}quick_battle_scene_1 【3】 1911 1792633534417207320 1910 1 720575940379279804 2048 0 . mno_quick_battle_scene_2 0 {!}quick_battle_scene_2 【3】 1911 1792633534417207320 1910 1 720575940379279805 2048 0 . mno_quick_battle_scene_3 0 {!}quick_battle_scene_3 【3】 1911 1792633534417207320 1910 1 720575940379279806 2048 0 . mno_quick_battle_scene_4 0 {!}quick_battle_scene_4 【3】 1911 1792633534417207320 1910 1 720575940379279807 2048 0 . mno_quick_battle_scene_5 0 {!}quick_battle_scene_5 【3】 1911 1792633534417207320 1910 1 720575940379279808 2048 0 . mno_go_back 0 {!}Go_back 【1】 2055 0 .
            如果都准确无误都找到了,说明menu的控制字规律已经掌握。


            IP属地:四川11楼2016-01-29 21:58
            收起回复
              2-1.menu的汉化:
              例如,你增加了这些:
              menu_xxx none 0 3 mno_1(省略代码) . mno_2(省略代码) . mno_3(省略代码) .
              找到cns文件夹里的game_menus.csv文件,在任一行添加
              menu_xxx|菜 单
              mno_1|子 菜 单 一
              mno_2|子 菜 单 二
              mno_3|子 菜 单 三
              按照这种格式汉化即可。


              IP属地:四川12楼2016-01-29 21:58
              回复
                利用这个帖子的内容已经足够做一些简单的mod了~
                唯一一点遗憾是txt修改和MS矛盾,一编译txt都白弄了,orz


                IP属地:广东来自Android客户端13楼2016-01-29 23:15
                收起回复
                  2025-08-20 21:41:08
                  广告
                  不感兴趣
                  开通SVIP免广告
                  本来看上去还没完不打算插,但既然已经被插了我就来个好评
                  话说这已经不是经验分享是教程了吧


                  IP属地:福建14楼2016-01-29 23:24
                  收起回复
                    早上一起来我就见到了这攻略贴,txt和py的修改关系了解更透彻了。


                    IP属地:河南来自手机贴吧15楼2016-01-30 08:16
                    收起回复
                      LZ,关于添加领主私兵问题请允许我在贴这问一下,触发器是新添加一个私兵新建一个触发器吗?


                      IP属地:河北来自Android客户端16楼2016-01-30 13:19
                      收起回复
                        新人又来提问,小地图如何默认开启


                        IP属地:江苏来自Android客户端17楼2016-01-30 18:47
                        收起回复
                          尽管还是不懂,但是如此良心的教程给好评


                          IP属地:浙江来自Android客户端18楼2016-01-30 19:11
                          收起回复
                            4.scripts.txt
                            这个文件就是脚本文件,也可以理解为一个函数库。几乎所有的底层功能都写在这里,在需要的时候进行调用。
                            文件的格式比较好辨认,文件第二行的那个数字就是大控制字,代表一共有多少个脚本。就随便举个例子。
                            set_faction -1
                            【2】 2133 2 1224979098644774912 20 1 3 936748722493063442432345564227567643 1224979098644774912
                            类似这样的就是一个完整的脚本。都是以xxx_xxx -1命名,直到下一个为止是一个脚本。这里的【2】是小控制字,代表后面跟着2个py语句。每个脚本就一个控制字,多方便。
                            ————————————————————————————
                            我们需要注意的一点是,并不是写在这个文件里的脚本在游戏里都会被执行。我们可以把scripts文件理解为函数库,只有在需要的时候调用,不需要的时候闲置就行。调用的py语句的格式是(call_script, "script_xxx", "变量1","变量2",……”变量x”),其中这些变量就相当于函数的实参(学过编程的可以明白,没学过编程却又感兴趣的请自行百度此概念,我没有信心讲好)。
                            ——————————————————————————————
                            但scripts文件中有一个脚本是特殊的,就是game_start -1,这个是每个mod都会有的,游戏开新档时就会调用的(比如说开局给某个领主随机某个封地就在这里)。
                            举个例子,我在scripts文件里写了一个新脚本,名为test_1,要想在开局时生效就要在game_start这个脚本里添加一个调用:(call_script, "script_test_1","变量1", "变量2",……”变量x”),然后就可以了。当然脚本的调用不止在这里,触发器、对话、场景等等都会经常用到。


                            IP属地:四川本楼含有高级字体20楼2016-01-31 19:31
                            回复
                              2025-08-20 21:35:08
                              广告
                              不感兴趣
                              开通SVIP免广告
                              想了一下,还是按我自己的理解解释一下形参(形式参数)和实参(实际参数)。
                              没记错的话,初中就应该学到数学的方程了。我就拿这个举例,f(x)=x+y,这里的f(x)就是代表一个函数,或者说是一个公式。等号右边的x和y就相当于形参,形参不代表具体某个值,只是一个形式而已。而实参,就是实际传递的值,比如x=1,y=2就是一组实参。
                              那回到我们讲到的脚本调用,首先我们写好的脚本里一定会有一个或几个形参,然后调用的时候就需要传递相应个数的实参,这样才能成功执行我们想得到的功能。
                              以下给出一个完整的例子(#后跟着的文字是注释,为了方便理解,就用py展示了):
                              ("check_agent_can_use_remote_weapon_store_item_to_reg5", #脚本名
                              [
                              (store_script_param, ":var_0", 1), #给第一个参数赋值为1,并储存(定义第一个形参)
                              (store_script_param, ":var_1", 2), #给第二个参数赋值为2,并储存(定义第二个形参)
                              ]),
                              (call_script, "script_ check_agent_can_use_remote_weapon_store_item_to_reg5",":var_1", ":var_2"),
                              #调用上面那个脚本
                              调用后,":var_1"对应脚本里的第一句(第一个形参),被赋值为1;":var_2"对应脚本里的第二句第二句(第二个形参),被赋值为2。这样调用就结束了。这样一看,和以前学的数学方程其实是一个道理,只是以编程语言的形式展现出来。


                              IP属地:四川21楼2016-01-31 19:33
                              回复