liyun_1981 发表于 2019-2-22 16:34

自制IL汇编语言源文件内容自动替换工具,继年前的帖子“Unity引擎类游戏MOD制作通用教程。。。”后新年第一弹!!!

本帖最后由 liyun_1981 于 2019-5-30 12:10 编辑

前言


    如题,IL汇编语言是啥玩意及这个工具的由来,请水友们先阅读我年前发的这个帖子:Unity引擎类游戏MOD制作通用教程,一个非游戏软件行业的软件系统架构师的经验谈,跟水友们分享经验,2019年春节前的献礼!!!


正题

    首先,此工具的主要作用是:通过指定的IL代码配置文件file-il.xml自动批量替换通过Java正则表达式查询匹配到的所有IL汇编语言源代码文件(下面简称IL源文件),以达到通过一个配置文件一次性替换多个不同游戏版本的IL源文件的目的。

    下面,再举例说明下使用此工具自动替换《开拓者:拥王者》的GOG v1.3.3 版本的反编译游戏核心业务逻辑类库文件Assembly-CSharp.dll后得到的IL源文件Assembly-CSharp.il,操作步骤如下:
1、解压缩game.7z(有需要的水友请到我这个帖子下载:强迫症必备,游戏修改党必备,游戏老玩家必备,高端玩家必备,自制游戏统一管理工具,对所有游戏均可参数化配置等等)到任意目录,例如:D:\tools;

2、在任意硬盘分区新建3个目录,例如:E:\Decompile,E:\Decompile\DLL,E:\Decompile\DLL-ildasm,将文件Assembly-CSharp.dll复制到E:\Decompile\DLL目录;

3、打开“VS 2017的开发人员命令提示符 ”,输入命令:
cd /d "E:\Decompile\DLL"
ildasm Assembly-CSharp.dll /output:..\DLL-ildasm\Assembly-CSharp.il
此时在E:\Decompile\DLL目录会生成Assembly-CSharp.res和Assembly-CSharp.il两个文件,我们只关心文件Assembly-CSharp.il;

4、输入命令:
cd /d "D:\tools\game\bin"
file -rfil* (?i)\.il$ E:/Decompile/DLL-ildasm
这条file命令是条模拟执行命令,它的含义是根据配置文件D:\tools\game\bin\file-il.xml自动替换E:/Decompile/DLL-ildasm目录中所有文件扩展名为.il的文件内容;如果命令已正确的执行了,输出内容应该类似如下信息:开始执行程序…

开始解析命令参数“-rfil* (?i)\.il$ E:/Decompile/DLL-ildasm”…

命令参数“-rfil* (?i)\.il$ E:/Decompile/DLL-ildasm”解析完毕。耗时:0时0分0秒10毫秒。

模拟开始执行命令“file -rfil* "(?i)\.il$" "E:\Decompile\DLL-ildasm" ".\file-il.xml" 2147483647”…

替换文件    E:\Decompile\DLL-ildasm\Assembly-CSharp.il
已生成替换IL源文件"E:\Decompile\DLL-ildasm\Assembly-CSharp.il"内容所需的IL配置文件"E:\Decompile\DLL-ildasm\Assembly-CSharp.il.xml"!

模拟命令“file -rfil* "(?i)\.il$" "E:\Decompile\DLL-ildasm" ".\file-il.xml" 2147483647”执行完毕。处理了0个目录,1个文件(大小:0TB    0GB   64MB824KB118B);耗时:0时0分0秒901毫秒。

程序执行完毕。处理了0个目录,1个文件(大小:0TB    0GB   64MB824KB118B);耗时:0时0分0秒923毫秒。



此时,说明IL配置文件file-il.xml内容是与IL源文件Assembly-CSharp.il完全匹配的;再输入命令 file -rfil+ (?i)\.il$ E:/Decompile/DLL-ildasm 正式执行一遍,即可得到预期的已被修改了的IL源文件Assembly-CSharp.il;如果执行模拟命令时输出了错误信息,则说明IL配置文件file-il.xml内容与IL源文件Assembly-CSharp.il不完全匹配,需要修正配置文件再重新执行命令;如果配置文件中配置的需要替换或新增的IL代码内容不能全部成功匹配的话,输出内容应该类似如下信息:
开始执行程序…

开始解析命令参数“-rfil* (?i)\.il$ E:/Decompile/DLL-ildasm”…

命令参数“-rfil* (?i)\.il$ E:/Decompile/DLL-ildasm”解析完毕。耗时:0时0分0秒8毫秒。

模拟开始执行命令“file -rfil* "(?i)\.il$" "E:\Decompile\DLL-ildasm" ".\file-il.xml" 2147483647”…

替换文件    E:\Decompile\DLL-ildasm\Assembly-CSharp.il
替换文件"E:\Decompile\DLL-ildasm\Assembly-CSharp.il"失败!错误信息:IL配置文件与IL源文件内容不匹配!


2楼附上本人使用的自动替换IL源文件Assembly-CSharp.il的配置文件片段,再跟水友们简明的说明下关键节点的含义。IL配置文件file-il.xml可以在 game\bin 目录下找到。



liyun_1981 发表于 2019-2-22 16:34

本帖最后由 liyun_1981 于 2019-5-29 19:25 编辑

下面是我自动替换《开拓者:拥王者》GOG v1.3.3 版本的Assembly-CSharp.il文件使用的配置文件片段,此配置片段内容实现了以下两个主要功能及其他功能:


1、新增隐藏UI开关快捷键 Ctrl + Alt + H;
2、角色等级上限及经验值修改。


配置文件内容如下:<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ILCodes>
    <comment>
    ILCodes配置集节点结构说明:
    ILCodes节点由一个唯一节点comment、一个唯一节点mode和多个ILCode节点按顺序组成,comment节点必须在最前面。
    ILCodes::comment            ILCodes配置集节点结构说明,对IL文件的修改无影响,仅此说明而已。
    ILCodes::mode               对IL源文件内容的处理模式,取值范围为:0,1,默认值为0;取0表示先根据ILCodes::ILCode节点下的ILCode::queryRegex节点和ILCode::codeRegex节点值查询定位IL源文件中需要修改的内容(此时将忽略ILCode::processingMode为0的所有ILCode节点,且会更新ILCode::processingMode不为0的所有ILCode节点的ILCode::lineNumber节点值),再自动生成已修改的IL源文件;取1表示根据ILCodes::ILCode节点下的ILCode::lineNumber节点值直接自动生成已修改的IL源文件。
    ILCodes::ILCode             ILCode配置节点,包括对IL代码的处理模式和修改IL代码片段所需的相关参数等等。
    ILCode节点由processingMode、quoteMode、lineNumber、codeDesc、queryRegex、codeRegex、codeFragment节点按顺序组成,processingMode节点必须在最前面。
    ILCode::processingMode      在自动生成已修改的IL源文件时对IL代码的处理模式,取值范围为:0,1,2,默认值为0;取0表示提取IL源文件的原始数据;取1表示提取ILCode::codeFragment作为替换数据,此时ILCode::queryRegex节点和ILCode::codeRegex节点都不能为空,且ILCode::codeRegex节点值最多只能指定2个正则查询表达式,分别匹配起始代码行和终止代码行,只指定1个则表示只唯一匹配一行待替换代码;取2表示提取ILCode::codeFragment作为新增数据,此时ILCode::queryRegex节点不能为空,且ILCode::codeRegex节点值将被忽略。
    ILCode::quoteMode         对ILCode::queryRegex节点和ILCode::codeRegex节点表示的正则查询表达式是否启用引用模式,取值范围为:0,1,默认值为0;取0表示不启用引用模式;取1表示启用引用模式,此时正则查询表达式将被当成无特殊含义的普通字符串对待。
    ILCode::lineNumber          IL源文件中IL代码片段的起止行号,匹配的正则表达式为:(\d*)(-(\d*))?;取值范围:最小值为1,最大值为IL源文件的最大行号;如果要修改的代码只有1行,可以只指定一个行号,即1与1-1等效。
    ILCode::codeDesc            需要修改的IL代码片段的功能描述。
    ILCode::queryRegex          在IL源文件中查询定位要修改的IL代码片段时所需的正则查询表达式;仅当ILCode::processingMode不为0时有效;若ILCode::processingMode为1,将继续向上回溯查询ILCode::codeRegex以正确定位。
    ILCode::codeRegex         在IL源文件中查询定位要修改的IL代码片段时所需的正则查询表达式;仅当ILCode::processingMode为1时有效。
    ILCode::codeFragment      在IL源文件中ILCode::lineNumber位置处需要被替换或新增的IL代码片段。
    </comment>
    <mode>0</mode>
    <ILCode>
      <processingMode>0</processingMode>
      <quoteMode>0</quoteMode>
      <lineNumber>1-37599</lineNumber>
      <queryRegex></queryRegex>
      <codeRegex></codeRegex>
      <codeDesc></codeDesc>
      <codeFragment></codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>1</processingMode>
      <quoteMode>1</quoteMode>
      <lineNumber>37600-37611</lineNumber>
      <queryRegex>end of method BlueprintCharacterClass::MeetsPrerequisites</queryRegex>
      <codeRegex>
      IL_001a
      IL_002f
      </codeRegex>
      <codeDesc>职业等级上限及升级能力点数修改</codeDesc>
      <codeFragment>
    IL_001a:ldc.i4.s   40
    IL_001c:blt      IL_0023
    IL_0021:ldc.i4.0
    IL_0022:ret
    IL_0023:ldarg.0
    IL_0024:ldfld      bool Kingmaker.Blueprints.Classes.BlueprintCharacterClass::PrestigeClass
    IL_0029:brfalse    IL_0038
    IL_002e:ldloc.0
    IL_002f:ldc.i4.s   40
      </codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>0</processingMode>
      <quoteMode>0</quoteMode>
      <lineNumber>37612-72604</lineNumber>
      <queryRegex></queryRegex>
      <codeRegex></codeRegex>
      <codeDesc></codeDesc>
      <codeFragment></codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>1</processingMode>
      <quoteMode>1</quoteMode>
      <lineNumber>72605-72610</lineNumber>
      <queryRegex>end of method GlobalMapRoot::.ctor</queryRegex>
      <codeRegex>
      IL_0000
      IL_0011
      </codeRegex>
      <codeDesc>角色大地图移动速度修改(VisualSpeedBase越大移动越快,MechanicsSpeedBase越大游戏时间流逝越慢)</codeDesc>
      <codeFragment>
    IL_0000:ldarg.0
    IL_0001:ldc.r4   0.02
    IL_0006:stfld      float32 Kingmaker.Blueprints.Root.GlobalMapRoot::VisualSpeedBase
    IL_000b:ldarg.0
    IL_000c:ldc.r4   12.
    IL_0011:stfld      float32 Kingmaker.Blueprints.Root.GlobalMapRoot::MechanicsSpeedBase
      </codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>0</processingMode>
      <quoteMode>0</quoteMode>
      <lineNumber>72611-149704</lineNumber>
      <queryRegex></queryRegex>
      <codeRegex></codeRegex>
      <codeDesc></codeDesc>
      <codeFragment></codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>1</processingMode>
      <quoteMode>1</quoteMode>
      <lineNumber>149705-149715</lineNumber>
      <queryRegex>end of method TimeController::Tick</queryRegex>
      <codeRegex>
      IL_0063
      IL_007f
      </codeRegex>
      <codeDesc>角色移动速度修改(移动1.5倍速,战斗1.25倍速)</codeDesc>
      <codeFragment>
    IL_0063:beq      IL_0068
    IL_0064:call       class Kingmaker.Game Kingmaker.Game::get_Instance()
    IL_0065:callvirt   instance valuetype Kingmaker.GameModes.GameModeType Kingmaker.Game::get_CurrentMode()
    IL_0066:ldc.i4.7
    IL_0067:bne.un   IL_00aa
    IL_0068:call       class Kingmaker.Game Kingmaker.Game::get_Instance()
    IL_0069:callvirt   instance class Kingmaker.Player Kingmaker.Game::get_Player()
    IL_006a:callvirt   instance bool Kingmaker.Player::get_IsInCombat()
    IL_006b:brtrue    IL_0073
    IL_006c:ldarg.0
    IL_006d:ldarg.0
    IL_006e:call       instance float32 Kingmaker.Controllers.TimeController::get_DeltaTime()
    IL_006f:ldc.r4   1.5
    IL_0070:mul
    IL_0071:call       instance void Kingmaker.Controllers.TimeController::set_DeltaTime(float32)
    IL_0072:br    IL_0079
    IL_0073:ldarg.0
    IL_0074:ldarg.0
    IL_0075:call       instance float32 Kingmaker.Controllers.TimeController::get_DeltaTime()
    IL_0076:ldc.r4   1.25
    IL_0077:mul
    IL_0078:call       instance void Kingmaker.Controllers.TimeController::set_DeltaTime(float32)
    IL_0079:ldarg.0
    IL_007a:ldarg.0
    IL_007b:call       instance float32 Kingmaker.Controllers.TimeController::get_DeltaTime()
    IL_007f:call       instance void Kingmaker.Controllers.TimeController::set_GameDeltaTime(float32)
      </codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>0</processingMode>
      <quoteMode>0</quoteMode>
      <lineNumber>149716-303661</lineNumber>
      <queryRegex></queryRegex>
      <codeRegex></codeRegex>
      <codeDesc></codeDesc>
      <codeFragment></codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>2</processingMode>
      <quoteMode>1</quoteMode>
      <lineNumber>303661-303661</lineNumber>
      <queryRegex>.field public class Kingmaker.GameStatistic Statistic</queryRegex>
      <codeRegex></codeRegex>
      <codeDesc>新增隐藏UI开关快捷键 Ctrl + Alt + H</codeDesc>
      <codeFragment>.field public class UnityEngine.GameObject GameObject</codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>0</processingMode>
      <quoteMode>0</quoteMode>
      <lineNumber>303662-304438</lineNumber>
      <queryRegex></queryRegex>
      <codeRegex></codeRegex>
      <codeDesc></codeDesc>
      <codeFragment></codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>1</processingMode>
      <quoteMode>1</quoteMode>
      <lineNumber>304439-304444</lineNumber>
      <queryRegex>end of method Game::Initialize</queryRegex>
      <codeRegex>
      IL_0037
      IL_0048
      </codeRegex>
      <codeDesc>新增隐藏UI开关快捷键 Ctrl + Alt + H</codeDesc>
      <codeFragment><![CDATA[
      IL_0037:ldarg.0
      IL_0038:ldfld      class Kingmaker.UI.KeyboardAccess Kingmaker.Game::Keyboard
      IL_0039:call       void Kingmaker.Utility.Screenshot::Initialize(class Kingmaker.UI.KeyboardAccess)
      IL_003a:ldarg.0
      IL_003b:ldfld      class AuraSupport Kingmaker.Game::AuraSupport
      IL_003c:callvirt   instance void AuraSupport::Initialize()
      IL_003d:ldarg.0
      IL_003e:ldfld      class Kingmaker.UI.KeyboardAccess Kingmaker.Game::Keyboard
      IL_003f:ldstr      "HideUI"
      IL_0040:ldarg.0
      IL_0041:ldftn      instance void Kingmaker.Game::'<Initialize>m__13'()
      IL_0042:newobj   instance void System.Action::.ctor(object,
                                                                        native int)
      IL_0048:callvirt   instance void Kingmaker.UI.KeyboardAccess::Bind(string,
                                                                           class System.Action)]]>
      </codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>0</processingMode>
      <quoteMode>0</quoteMode>
      <lineNumber>304445-307536</lineNumber>
      <queryRegex></queryRegex>
      <codeRegex></codeRegex>
      <codeDesc></codeDesc>
      <codeFragment></codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>2</processingMode>
      <quoteMode>1</quoteMode>
      <lineNumber>307536-307536</lineNumber>
      <queryRegex>end of method Game::.cctor</queryRegex>
      <codeRegex></codeRegex>
      <codeDesc>新增隐藏UI开关快捷键 Ctrl + Alt + H</codeDesc>
      <codeFragment><![CDATA[
.method private hidebysig instance void
          '<Initialize>m__13'() cil managed
{
    .custom instance void System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )
    // 代码大小       19 (0x13)
    .maxstack8
    IL_0000:ldarg.0
    IL_0001:ldfld      class UnityEngine.GameObject Kingmaker.Game::GameObject
    IL_0002:brtrue   IL_000a
    IL_0003:ldarg.0
    IL_0004:ldarg.0
    IL_0005:ldfld      class Kingmaker.UI.UIAccess Kingmaker.Game::UI
    IL_0006:callvirt   instance class Kingmaker.Assets.UI.MainCanvas Kingmaker.UI.UIAccess::get_MainCanvas()
    IL_0007:callvirt   instance class UnityEngine.CanvasGroup Kingmaker.Assets.UI.MainCanvas::get_CanvasGroup()
    IL_0008:callvirt   instance class UnityEngine.GameObject UnityEngine.Component::get_gameObject()
    IL_0009:stfld      class UnityEngine.GameObject Kingmaker.Game::GameObject
    IL_000a:ldarg.0
    IL_000b:ldfld      class UnityEngine.GameObject Kingmaker.Game::GameObject
    IL_000c:ldarg.0
    IL_000d:ldfld      class UnityEngine.GameObject Kingmaker.Game::GameObject
    IL_000e:callvirt   instance bool UnityEngine.GameObject::get_activeSelf()
    IL_000f:ldc.i4.0
    IL_0010:ceq
    IL_0011:callvirt   instance void UnityEngine.GameObject::SetActive(bool)
    IL_0012:ret
} // end of method Game::'<Initialize>m__13']]>
      </codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>0</processingMode>
      <quoteMode>0</quoteMode>
      <lineNumber>307537-522489</lineNumber>
      <queryRegex></queryRegex>
      <codeRegex></codeRegex>
      <codeDesc></codeDesc>
      <codeFragment></codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>1</processingMode>
      <quoteMode>1</quoteMode>
      <lineNumber>522490-522509</lineNumber>
      <queryRegex>end of method KeyboardAccess::RegisterBuiltinBindings</queryRegex>
      <codeRegex>
      IL_04d1
      IL_04ea
      </codeRegex>
      <codeDesc>新增隐藏UI开关快捷键 Ctrl + Alt + H</codeDesc>
      <codeFragment><![CDATA[
    IL_04d1:ldarg.0
    IL_04d2:ldstr      "RapidBugReportWindowOpen"
    IL_04d3:ldc.i4.s   98
    IL_04d4:ldloc.0
    IL_04d5:ldc.i4.1
    IL_04d6:ldc.i4.1
    IL_04d7:ldc.i4.1
    IL_04d8:ldc.i4.0
    IL_04d9:ldc.i4.0
    IL_04da:call       instance void Kingmaker.UI.KeyboardAccess::RegisterBinding(string,
                                                                                    valuetype UnityEngine.KeyCode,
                                                                                    class System.Collections.Generic.IEnumerable`1<valuetype Kingmaker.GameModes.GameModeType>,
                                                                                    bool,
                                                                                    bool,
                                                                                    bool,
                                                                                    bool,
                                                                                    valuetype Kingmaker.UI.KeyboardAccess/ModificationSide)
    IL_04db:ldarg.0
    IL_04dc:ldstr      "HideUI"
    IL_04dd:ldc.i4.s   104
    IL_04de:ldloc.0
    IL_04df:ldc.i4.1
    IL_04e0:ldc.i4.1
    IL_04e1:ldc.i4.0
    IL_04e2:ldc.i4.0
    IL_04e3:ldc.i4.0
    IL_04e4:call       instance void Kingmaker.UI.KeyboardAccess::RegisterBinding(string,
                                                                                    valuetype UnityEngine.KeyCode,
                                                                                    class System.Collections.Generic.IEnumerable`1<valuetype Kingmaker.GameModes.GameModeType>,
                                                                                    bool,
                                                                                    bool,
                                                                                    bool,
                                                                                    bool,
                                                                                    valuetype Kingmaker.UI.KeyboardAccess/ModificationSide)
    IL_04e5:ldarg.0
    IL_04e6:call       void Kingmaker.PubSubSystem.EventBus::Subscribe(object)
    IL_04ea:ret]]>
      </codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>0</processingMode>
      <quoteMode>0</quoteMode>
      <lineNumber>522510-646139</lineNumber>
      <queryRegex></queryRegex>
      <codeRegex></codeRegex>
      <codeDesc></codeDesc>
      <codeFragment></codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>1</processingMode>
      <quoteMode>1</quoteMode>
      <lineNumber>646140-646193</lineNumber>
      <queryRegex>end of method CharSLevel::FillData</queryRegex>
      <codeRegex>
      IL_00bd
      IL_0172
      </codeRegex>
      <codeDesc>角色等级上限及经验值修改</codeDesc>
      <codeFragment>
    IL_00bd:br         IL_0100
    IL_00c2:ldarg.0
    IL_00c3:ldfld      class ['Assembly-CSharp-firstpass']TMPro.TextMeshProUGUI Kingmaker.UI.ServiceWindow.CharacterScreen.CharSLevel::Level
    IL_00c8:ldloc.0
    IL_00c9:ldfld      class Kingmaker.Localization.LocalizedString Kingmaker.Blueprints.Root.Strings.UITextCharSheet::LEVEL
    IL_00ce:call       string Kingmaker.Localization.LocalizedString::op_Implicit(class Kingmaker.Localization.LocalizedString)
    IL_00d3:ldstr      " "
    IL_00d8:ldarg.1
    IL_00d9:ldfld      class Kingmaker.UnitLogic.UnitProgressionData Kingmaker.UnitLogic.UnitDescriptor::Progression
    IL_00de:callvirt   instance int32 Kingmaker.UnitLogic.UnitProgressionData::get_CharacterLevel()
    IL_00e3:box      System.Int32
    IL_00e8:call       string System.String::Concat(object,
                                                                object,
                                                                object)
    IL_00ed:callvirt   instance void ['Assembly-CSharp-firstpass']TMPro.TMP_Text::set_text(string)
    IL_00f2:ldarg.0
    IL_00f3:ldfld      class UnityEngine.UI.Image Kingmaker.UI.ServiceWindow.CharacterScreen.CharSLevel::NegativeLevel
    IL_00f8:callvirt   instance class UnityEngine.GameObject UnityEngine.Component::get_gameObject()
    IL_00fd:ldc.i4.0
    IL_00fe:callvirt   instance void UnityEngine.GameObject::SetActive(bool)
    IL_0100:ldarg.1
    IL_0101:ldfld      class Kingmaker.UnitLogic.UnitProgressionData Kingmaker.UnitLogic.UnitDescriptor::Progression
    IL_0102:callvirt   instance int32 Kingmaker.UnitLogic.UnitProgressionData::get_CharacterLevel()
    IL_0103:ldc.i4.s20
    IL_0104:bge      IL_0141
    IL_0105:call       class Kingmaker.Game Kingmaker.Game::get_Instance()
    IL_0106:callvirt   instance class Kingmaker.Blueprints.Root.BlueprintRoot Kingmaker.Game::get_BlueprintRoot()
    IL_0107:ldfld      class Kingmaker.Blueprints.Root.ProgressionRoot Kingmaker.Blueprints.Root.BlueprintRoot::Progression
    IL_0108:ldfld      class Kingmaker.Blueprints.Classes.BlueprintStatProgression Kingmaker.Blueprints.Root.ProgressionRoot::XPTable
    IL_0109:ldfld      int32[] Kingmaker.Blueprints.Classes.BlueprintStatProgression::Bonuses
    IL_010a:ldarg.1
    IL_010b:ldfld      class Kingmaker.UnitLogic.UnitProgressionData Kingmaker.UnitLogic.UnitDescriptor::Progression
    IL_010c:callvirt   instance int32 Kingmaker.UnitLogic.UnitProgressionData::get_CharacterLevel()
    IL_010d:ldc.i4.1
    IL_010e:add
    IL_010f:ldelem.i4
    IL_0110:ldc.i4.2
    IL_0111:div
    IL_011c:stloc.3
    IL_011d:call       class Kingmaker.Game Kingmaker.Game::get_Instance()
    IL_011e:callvirt   instance class Kingmaker.Blueprints.Root.BlueprintRoot Kingmaker.Game::get_BlueprintRoot()
    IL_011f:ldfld      class Kingmaker.Blueprints.Root.ProgressionRoot Kingmaker.Blueprints.Root.BlueprintRoot::Progression
    IL_0120:ldfld      class Kingmaker.Blueprints.Classes.BlueprintStatProgression Kingmaker.Blueprints.Root.ProgressionRoot::XPTable
    IL_0121:ldfld      int32[] Kingmaker.Blueprints.Classes.BlueprintStatProgression::Bonuses
    IL_0122:ldarg.1
    IL_0123:ldfld      class Kingmaker.UnitLogic.UnitProgressionData Kingmaker.UnitLogic.UnitDescriptor::Progression
    IL_0124:callvirt   instance int32 Kingmaker.UnitLogic.UnitProgressionData::get_CharacterLevel()
    IL_0125:ldelem.i4
    IL_0126:ldc.i4.2
    IL_0127:div
    IL_0128:stloc.s    V_4
    IL_0140:br      IL_0174
    IL_0141:call       class Kingmaker.Game Kingmaker.Game::get_Instance()
    IL_0142:callvirt   instance class Kingmaker.Blueprints.Root.BlueprintRoot Kingmaker.Game::get_BlueprintRoot()
    IL_0143:ldfld      class Kingmaker.Blueprints.Root.ProgressionRoot Kingmaker.Blueprints.Root.BlueprintRoot::Progression
    IL_0144:ldfld      class Kingmaker.Blueprints.Classes.BlueprintStatProgression Kingmaker.Blueprints.Root.ProgressionRoot::XPTable
    IL_0145:ldfld      int32[] Kingmaker.Blueprints.Classes.BlueprintStatProgression::Bonuses
    IL_0146:ldc.i4.s20
    IL_0147:ldelem.i4
    IL_0148:ldc.i4.2
    IL_0149:div
    IL_014a:ldarg.1
    IL_014b:ldfld      class Kingmaker.UnitLogic.UnitProgressionData Kingmaker.UnitLogic.UnitDescriptor::Progression
    IL_014c:callvirt   instance int32 Kingmaker.UnitLogic.UnitProgressionData::get_CharacterLevel()
    IL_014d:ldc.i4.s19
    IL_014e:sub
    IL_014f:ldc.i490000
    IL_0150:mul
    IL_0151:add
    IL_0152:stloc.3
    IL_0153:ldloc.3
    IL_0154:ldc.i490000
    IL_0155:sub
    IL_0172:stloc.s    V_4
      </codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>0</processingMode>
      <quoteMode>0</quoteMode>
      <lineNumber>646194-699346</lineNumber>
      <queryRegex></queryRegex>
      <codeRegex></codeRegex>
      <codeDesc></codeDesc>
      <codeFragment></codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>1</processingMode>
      <quoteMode>1</quoteMode>
      <lineNumber>699347-699348</lineNumber>
      <queryRegex><!]></queryRegex>
      <codeRegex>
      IL_0007
      IL_000c
      </codeRegex>
      <codeDesc>游戏字体大小缩放设置修改(改为原值的1.25倍)</codeDesc>
      <codeFragment>
    IL_0007:call       instance float32 Kingmaker.UI.SettingsUI.SettingsEntitySlider::get_CurrentValue()
    IL_0008:ldc.r4    1.25
    IL_0009:mul
    IL_000c:stfld      float32 ['Assembly-CSharp-firstpass']TMPro.FaceInfo::Scale
      </codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>0</processingMode>
      <quoteMode>0</quoteMode>
      <lineNumber>699349-790675</lineNumber>
      <queryRegex></queryRegex>
      <codeRegex></codeRegex>
      <codeDesc></codeDesc>
      <codeFragment></codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>1</processingMode>
      <quoteMode>1</quoteMode>
      <lineNumber>790676-790677</lineNumber>
      <queryRegex>end of method AbilityAcceptBurnOnCast::OnCast</queryRegex>
      <codeRegex>
      IL_0019
      IL_001e
      </codeRegex>
      <codeDesc>修改施法造成的友军伤害减半</codeDesc>
      <codeFragment>
    IL_0019:ldfld      int32 Kingmaker.UnitLogic.Class.Kineticist.AbilityAcceptBurnOnCast::BurnValue
    IL_001a:ldc.i4.2
    IL_001b:div
    IL_001e:ldarg.1
      </codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>0</processingMode>
      <quoteMode>0</quoteMode>
      <lineNumber>790678-791595</lineNumber>
      <queryRegex></queryRegex>
      <codeRegex></codeRegex>
      <codeDesc></codeDesc>
      <codeFragment></codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>1</processingMode>
      <quoteMode>1</quoteMode>
      <lineNumber>791596-791604</lineNumber>
      <queryRegex>end of method KineticistAbilityBurnCost::GetTotal</queryRegex>
      <codeRegex>
      IL_0095
      IL_00a3
      </codeRegex>
      <codeDesc>修改施法造成的友军伤害减半</codeDesc>
      <codeFragment>
    IL_0095:brfalse    IL_009c
    IL_009a:ldc.i4.1
    IL_009b:br         IL_009d
    IL_009c:ldc.i4.0
    IL_009d:mul
    IL_009e:add
    IL_009f:ldc.i4.2
    IL_00a0:div
    IL_00a3:ret
      </codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>0</processingMode>
      <quoteMode>0</quoteMode>
      <lineNumber>791605-796440</lineNumber>
      <queryRegex></queryRegex>
      <codeRegex></codeRegex>
      <codeDesc></codeDesc>
      <codeFragment></codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>1</processingMode>
      <quoteMode>1</quoteMode>
      <lineNumber>796441-796441</lineNumber>
      <queryRegex>end of method ApplyClassMechanics::ApplyHitPoints</queryRegex>
      <codeRegex>IL_00d4</codeRegex>
      <codeDesc>角色升级生命值修改(每级获得生命点数为:角色生命骰+2+体质加点)</codeDesc>
      <codeFragment>
    IL_00d4:ldc.i4.1
      </codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>0</processingMode>
      <quoteMode>0</quoteMode>
      <lineNumber>796442-804514</lineNumber>
      <queryRegex></queryRegex>
      <codeRegex></codeRegex>
      <codeDesc></codeDesc>
      <codeFragment></codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>1</processingMode>
      <quoteMode>1</quoteMode>
      <lineNumber>804515-804537</lineNumber>
      <queryRegex>end of method LevelUpController::CanLevelUp</queryRegex>
      <codeRegex>
      IL_0034
      IL_006c
      </codeRegex>
      <codeDesc>角色等级上限及经验值修改</codeDesc>
      <codeFragment>
    IL_0034:ldloc.0
    IL_0035:ldc.i4.s   40
    IL_0036:blt      IL_0039
    IL_0037:ldc.i4.0
    IL_0038:ret
    IL_0039:ldloc.0
    IL_003a:ldc.i4.s   20
    IL_003b:bge      IL_004e
    IL_003c:call       class Kingmaker.Game Kingmaker.Game::get_Instance()
    IL_003d:callvirt   instance class Kingmaker.Blueprints.Root.BlueprintRoot Kingmaker.Game::get_BlueprintRoot()
    IL_003e:ldfld      class Kingmaker.Blueprints.Root.ProgressionRoot Kingmaker.Blueprints.Root.BlueprintRoot::Progression
    IL_003f:ldfld      class Kingmaker.Blueprints.Classes.BlueprintStatProgression Kingmaker.Blueprints.Root.ProgressionRoot::XPTable
    IL_0040:ldloc.0
    IL_0041:ldc.i4.1
    IL_0042:add
    IL_0043:callvirt   instance int32 Kingmaker.Blueprints.Classes.BlueprintStatProgression::GetBonus(int32)
    IL_0044:ldc.i4.2
    IL_0045:div
    IL_0046:stloc.1
    IL_0047:ldloc.1
    IL_0048:ldarg.0
    IL_0049:ldfld      class Kingmaker.UnitLogic.UnitProgressionData Kingmaker.UnitLogic.UnitDescriptor::Progression
    IL_004a:callvirt   instance int32 Kingmaker.UnitLogic.UnitProgressionData::get_Experience()
    IL_004b:ble      IL_006e
    IL_004c:ldc.i4.0
    IL_004d:ret
    IL_004e:call       class Kingmaker.Game Kingmaker.Game::get_Instance()
    IL_004f:callvirt   instance class Kingmaker.Blueprints.Root.BlueprintRoot Kingmaker.Game::get_BlueprintRoot()
    IL_0050:ldfld      class Kingmaker.Blueprints.Root.ProgressionRoot Kingmaker.Blueprints.Root.BlueprintRoot::Progression
    IL_0051:ldfld      class Kingmaker.Blueprints.Classes.BlueprintStatProgression Kingmaker.Blueprints.Root.ProgressionRoot::XPTable
    IL_0052:ldc.i4.s   20
    IL_0053:callvirt   instance int32 Kingmaker.Blueprints.Classes.BlueprintStatProgression::GetBonus(int32)
    IL_0054:ldc.i4.2
    IL_0055:div
    IL_0056:ldloc.0
    IL_0057:ldc.i4.s   19
    IL_0058:sub
    IL_0059:ldc.i4   90000
    IL_005a:mul
    IL_005b:add
    IL_005c:stloc.1
    IL_005d:ldloc.1
    IL_005e:ldarg.0
    IL_005f:ldfld      class Kingmaker.UnitLogic.UnitProgressionData Kingmaker.UnitLogic.UnitDescriptor::Progression
    IL_0060:callvirt   instance int32 Kingmaker.UnitLogic.UnitProgressionData::get_Experience()
    IL_0061:ble      IL_006e
    IL_006c:ldc.i4.0
      </codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>0</processingMode>
      <quoteMode>0</quoteMode>
      <lineNumber>804538-806974</lineNumber>
      <queryRegex></queryRegex>
      <codeRegex></codeRegex>
      <codeDesc></codeDesc>
      <codeFragment></codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>1</processingMode>
      <quoteMode>1</quoteMode>
      <lineNumber>806975-806975</lineNumber>
      <queryRegex>end of method LevelUpState::.ctor</queryRegex>
      <codeRegex>IL_00c8</codeRegex>
      <codeDesc>角色属性点获得修改(每两级获得1点属性点)</codeDesc>
      <codeFragment>
    IL_00c8:ldc.i4.2
      </codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>0</processingMode>
      <quoteMode>0</quoteMode>
      <lineNumber>806976-825210</lineNumber>
      <queryRegex></queryRegex>
      <codeRegex></codeRegex>
      <codeDesc></codeDesc>
      <codeFragment></codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>1</processingMode>
      <quoteMode>1</quoteMode>
      <lineNumber>825211-825212</lineNumber>
      <queryRegex>end of method EncumbranceHelper::GetHeavy</queryRegex>
      <codeRegex>
      IL_007a
      IL_007f
      </codeRegex>
      <codeDesc>角色负重值修改(100倍负重)</codeDesc>
      <codeFragment>
    IL_007a:call       float64 System.Math::Round(float64)
    IL_007b:conv.i4
    IL_007c:ldc.i4.s   100
    IL_007d:mul
    IL_007f:conv.i4
      </codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>0</processingMode>
      <quoteMode>0</quoteMode>
      <lineNumber>825213-881686</lineNumber>
      <queryRegex></queryRegex>
      <codeRegex></codeRegex>
      <codeDesc></codeDesc>
      <codeFragment></codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>1</processingMode>
      <quoteMode>1</quoteMode>
      <lineNumber>881687-881692</lineNumber>
      <queryRegex>end of method ProgressionData::GetLevelEntry</queryRegex>
      <codeRegex>
      IL_0000
      IL_000d
      </codeRegex>
      <codeDesc>职业等级上限及升级能力点数修改</codeDesc>
      <codeFragment><![CDATA[
    IL_0000:ldarg.1
    IL_0001:ldc.i4.s   20
    IL_0002:rem
    IL_0003:starg.s   level
    IL_0004:ldarg.1
    IL_0005:brtrue.s   IL_0008
    IL_0006:ldc.i4.s   20
    IL_0007:starg.s   level
    IL_0008:newobj   instance void Kingmaker.UnitLogic.ProgressionData/'<GetLevelEntry>c__AnonStorey0'::.ctor()
    IL_0009:stloc.0
    IL_000a:ldloc.0
    IL_000b:ldarg.1
    IL_000c:stfld      int32 Kingmaker.UnitLogic.ProgressionData/'<GetLevelEntry>c__AnonStorey0'::level
    IL_000d:ldarg.0]]>
      </codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>0</processingMode>
      <quoteMode>0</quoteMode>
      <lineNumber>881693-894978</lineNumber>
      <queryRegex></queryRegex>
      <codeRegex></codeRegex>
      <codeDesc></codeDesc>
      <codeFragment></codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>1</processingMode>
      <quoteMode>1</quoteMode>
      <lineNumber>894979-894997</lineNumber>
      <queryRegex>end of method UnitProgressionData::AddClassLevel</queryRegex>
      <codeRegex>
      IL_0061
      IL_0081
      </codeRegex>
      <codeDesc>角色等级上限及经验值修改</codeDesc>
      <codeFragment>
    IL_0061:ldloc.0
    IL_0062:ldloc.0
    IL_0063:ldlen
    IL_0064:conv.i4
    IL_0065:ldc.i4.1
    IL_0066:sub
    IL_0067:ldarg.0
    IL_0068:call       instance int32 Kingmaker.UnitLogic.UnitProgressionData::get_CharacterLevel()
    IL_0069:call       int32 System.Math::Min(int32,
                                                          int32)
    IL_006a:ldelem.i4
    IL_006b:ldc.i4.2
    IL_006c:div
    IL_006d:stloc.1
    IL_006e:ldarg.0
    IL_006f:call       instance int32 Kingmaker.UnitLogic.UnitProgressionData::get_CharacterLevel()
    IL_0070:ldc.i4.s   20
    IL_0071:ble      IL_007b
    IL_0072:ldloc.1
    IL_0073:ldarg.0
    IL_0074:call       instance int32 Kingmaker.UnitLogic.UnitProgressionData::get_CharacterLevel()
    IL_0075:ldc.i4.s   20
    IL_0076:sub
    IL_0077:ldc.i4   90000
    IL_0078:mul
    IL_0079:add
    IL_007a:stloc.1
    IL_007b:ldarg.0
    IL_007c:ldarg.0
    IL_007d:call       instance int32 Kingmaker.UnitLogic.UnitProgressionData::get_Experience()
    IL_007e:ldloc.1
    IL_007f:call       int32 System.Math::Max(int32,
                                                          int32)
    IL_0081:call       instance void Kingmaker.UnitLogic.UnitProgressionData::set_Experience(int32)
      </codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>0</processingMode>
      <quoteMode>0</quoteMode>
      <lineNumber>894998-926505</lineNumber>
      <queryRegex></queryRegex>
      <codeRegex></codeRegex>
      <codeDesc></codeDesc>
      <codeFragment></codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>1</processingMode>
      <quoteMode>1</quoteMode>
      <lineNumber>926506-926509</lineNumber>
      <queryRegex>end of method CameraZoom::TickZoom</queryRegex>
      <codeRegex>
      IL_0088
      IL_008f
      </codeRegex>
      <codeDesc>视野缩放范围修改</codeDesc>
      <codeFragment>
    IL_0088:ldc.r4      30
    IL_008f:ldc.r4      5
      </codeFragment>
    </ILCode>
    <ILCode>
      <processingMode>0</processingMode>
      <quoteMode>0</quoteMode>
      <lineNumber>926510-1131623</lineNumber>
      <queryRegex></queryRegex>
      <codeRegex></codeRegex>
      <codeDesc></codeDesc>
      <codeFragment></codeFragment>
    </ILCode>
</ILCodes>



此配置文件中最重要的节点是:ILCodes::mode、ILCode::processingMode、ILCode::lineNumber、ILCode::queryRegex、ILCode::codeRegex、ILCode::codeFragment,具体含义参见ILCodes::comment节点,已经进行了详细的说明。

最后,由于昨天我的开发工具 myeclipse2018.12CI 突然冒出了只剩5天到期的坑爹问题,因而这次新增的file命令的新命令选项 -rfil 还没来得及详细测试,难免会有bug,感兴趣的水友们可以多多测试并把问题反馈给我!:Q


q345593023 发表于 2019-2-22 18:28

大佬厉害 有没有办法替换游戏里的字库 解决显示个别字显示不了的问题

liyun_1981 发表于 2019-2-23 00:00

q345593023 发表于 2019-2-22 18:28
大佬厉害 有没有办法替换游戏里的字库 解决显示个别字显示不了的问题

目前还没研究字库这块,有时间我研究研究。:lol

zs63156006 发表于 2019-2-27 22:26

大佬你的40级补丁在1.24版本各种跳出{:3_123:}
开局出门游戏跳出
游戏内读档跳出
大概是游戏内转场就会跳出

liyun_1981 发表于 2019-3-3 20:33

q345593023 发表于 2019-2-22 18:28
大佬厉害 有没有办法替换游戏里的字库 解决显示个别字显示不了的问题

字体补丁已经新鲜出炉!请转到我今天发的帖子下载!http://bbs.3dmgame.com/thread-5856425-1-1.html

一点解说 发表于 2019-3-14 05:58

大佬能不能出一个修改王者荣耀人物模型的教程

NickMa66 发表于 2021-9-5 23:32

大佬,我发现一个问题。我玩术士转职龙术士,因为龙术士升级经常要选天赋,而天赋数量是有限的,一直双倍加下去很快就会没有天赋可以选,然后就升不了级。

我想把这部分,也就是天赋X2的这段改回来,无奈没学过代码,想不出来怎么改,求指导。
页: [1]
查看完整版本: 自制IL汇编语言源文件内容自动替换工具,继年前的帖子“Unity引擎类游戏MOD制作通用教程。。。”后新年第一弹!!!