将军的荣耀3吧 关注:15,811贴子:271,916

【无用】教程:在战役中控制队友

只看楼主收藏回复

RT
需要解密版和电脑哦


IP属地:北京1楼2023-02-19 16:39回复
    概况
    在大征服者罗马及之后的游戏中, 战役btl文件大量使用长度不规则的结构,导致非常难改
    事件则独立放在了assets/luac/trigger里,使用luac简单加密,很容易解开
    那么先改改事件玩吧,控制队友靠它就够了


    IP属地:北京2楼2023-02-19 16:57
    收起回复
      1. lua配置
      编译luac环境对我这种小白实在太麻烦了,所以直接下载他的程序:
      在Sourceforge(自行百度)里搜索Luabinaries,然后根据路径下载那个红框并解压,记住解压的位置
      注意:必须是5.3.x 32位



      IP属地:北京3楼2023-02-19 17:03
      回复
        2. luadec配置
        luadec是解密luac的常用工具,请自行百度并安装:
        我是从这里找到的:三达不溜.52pojie.cn/thread-1224918-1-1.html
        同样,解压完之后记住位置


        IP属地:北京4楼2023-02-19 17:08
        回复
          3. 用luadec解密luac
          解压游戏安装包找到trigger文件夹,里面有以关卡序号命名的一堆luac文件;拷出来,记住位置
          我这里把这个文件夹叫Aimluac


          IP属地:北京5楼2023-02-19 17:12
          回复
            用命令行反编译luac命令如下:
            D:
            cd D:\Xmod\Lua\luadec\5.3\bin (luadec的位置)
            luadec D:\Xmod\Lua\Aimluac\stage10101.luac(需要解密的文件,写全位置)
            于是luac被解密如图,从local开始是文件内容


            选中明文内容,自己建一个文本文档改名为stage10101.lua保存


            IP属地:北京6楼2023-02-19 17:18
            回复
              stage10101.lua全文:
              local T = require("trigger")
              local G = require("gamedefine")
              init = function()
              -- function num : 0_0 , upvalues : T
              local tid = {}
              tid[1] = (T.create)("trigger_handle_1")
              ;
              (T.add_event)(tid[1], (T.event).AREA_LOST, 373, 1, 0)
              tid[2] = (T.create)("trigger_handle_2")
              ;
              (T.add_event)(tid[2], (T.event).ARMY_DIED, 6, 6)
              tid[3] = (T.create)("trigger_handle_3")
              ;
              (T.add_event)(tid[3], (T.event).AREA_LOST, 155, 1, 0)
              tid[4] = (T.create)("trigger_handle_4")
              ;
              (T.add_event)(tid[4], (T.event).AREA_LOST, 300, 1, 0)
              tid[5] = (T.create)("trigger_handle_5")
              ;
              (T.add_event)(tid[5], (T.event).ARMY_DIED, 5, 0)
              tid[6] = (T.create)("trigger_handle_6")
              ;
              (T.add_event)(tid[6], (T.event).ROUND_BEGIN, 1)
              end
              trigger_handle_1 = function()
              -- function num : 0_1 , upvalues : T, G
              (T.exec_action)((T.action).ARMY_MORALE, (G.armytype).COUNTRY, 1, (G.moral).DEC_25)
              end
              trigger_handle_2 = function()
              -- function num : 0_2 , upvalues : T, G
              (T.exec_action)((T.action).EXTRACTING, (G.armytype).AREA, 415, 2)
              ;
              (T.exec_action)((T.action).EXTRACTING, (G.armytype).GROUP, 3, 1)
              ;
              (T.exec_action)((T.action).ARMY_MORALE, (G.armytype).COUNTRY, 1, (G.moral).DEC_25)
              ;
              (T.exec_action)((T.action).EXTRACTING, (G.armytype).AREA, 387, 2)
              ;
              (T.exec_action)((T.action).EXTRACTING, (G.armytype).AREA, 443, 2)
              ;
              (T.exec_action)((T.action).DIALOGUE, 10112)
              end
              trigger_handle_3 = function()
              -- function num : 0_3 , upvalues : T, G
              (T.exec_action)((T.action).EXTRACTING, (G.armytype).GROUP, 4, 1)
              ;
              (T.exec_action)((T.action).EXTRACTING, (G.armytype).AREA, 415, 2)
              ;
              (T.exec_action)((T.action).EXTRACTING, (G.armytype).AREA, 387, 2)
              ;
              (T.exec_action)((T.action).EXTRACTING, (G.armytype).AREA, 443, 2)
              end
              trigger_handle_4 = function()
              -- function num : 0_4 , upvalues : T, G
              (T.exec_action)((T.action).EXTRACTING, (G.armytype).GROUP, 5, 1)
              ;
              (T.exec_action)((T.action).EXTRACTING, (G.armytype).AREA, 415, 2)
              ;
              (T.exec_action)((T.action).EXTRACTING, (G.armytype).AREA, 387, 2)
              ;
              (T.exec_action)((T.action).EXTRACTING, (G.armytype).AREA, 443, 2)
              end
              trigger_handle_5 = function()
              -- function num : 0_5 , upvalues : T, G
              (T.exec_action)((T.action).CHANGE_TARGET_AREA, (G.armytype).GROUP, 2, 411)
              ;
              (T.exec_action)((T.action).DIALOGUE, 10113)
              end
              trigger_handle_6 = function()
              -- function num : 0_6 , upvalues : T
              (T.exec_action)((T.action).DIALOGUE, 10111)
              end


              IP属地:北京7楼2023-02-19 17:19
              回复
                lua语言是很简明的,很容易知道代码是什么意思。
                比如事件1对应AREA_LOST,373,就可以看出来是在373地块失陷时触发;下面的效果则是(G.moral).DEC_25,即士气下降25.
                比如事件6对应ROUND_BEGIN, 1,就可以看出来是在第一回合开始时触发;下面的效果则是DIALOGUE, 10111,即出现对话10111,这个应该比较熟悉了吧
                想要控制队友只要在第一回合触发的那个事件里加一行代码即可:
                (T.exec_action)((T.action).RESCUE, 3) 其中3是队友的军团id
                RESCUE代表控制队友,在后面的图中经常出现话说队友这么强,干嘛要你救呢


                IP属地:北京8楼2023-02-19 17:34
                回复
                  好了,现在把lua变回luac:
                  在lua的安装文件夹里建一个文件夹叫trigger,把改好的lua放进去,然后用命令行如此操作:
                  D:
                  cd D:\Xmod\Lua\lua-5.3.4_Win32_bin
                  说明:打开工作文件夹,必须提前在工作文件夹里建好/trigger文件夹并把lua放进去
                  luac -o ./trigger/stage10101.luac ./trigger/stage10101.lua
                  说明:生成luac,必须用./的形式表示地址,luac内包含源文件文件路径 须与原版一致

                  没有任何提示对吗但是luac已经转换好了,把它拿去覆盖原版


                  IP属地:北京9楼2023-02-19 17:37
                  回复

                    打开游戏,第一回合事件6触发,队友一嗓子下去 就全部归玩家控制了实测无bug


                    IP属地:北京10楼2023-02-19 17:38
                    回复
                      dd,这也太爽了吧!
                      终于可以跟敌人打一场大的了


                      IP属地:中国香港11楼2023-02-19 17:46
                      回复
                        有些朋友可能会问,如何确定队友军团的id?
                        我之前做了工具,可以阅读btl并找出军团信息:

                        这张图里第一行数据是玩家,最左边那列是国家(3=德国,9=波兰),各个军团id可以查到


                        IP属地:北京12楼2023-02-19 17:58
                        收起回复
                          帮顶


                          IP属地:广东13楼2023-02-19 18:10
                          回复


                            IP属地:北京来自Android客户端14楼2023-02-19 20:36
                            回复
                              直接在手机上用lua解密就行了,工具不难找,而且也不用特地再加密回去


                              IP属地:广东来自Android客户端15楼2023-11-25 20:32
                              回复