自制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-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
大佬厉害 有没有办法替换游戏里的字库 解决显示个别字显示不了的问题
目前还没研究字库这块,有时间我研究研究。:lol
大佬你的40级补丁在1.24版本各种跳出{:3_123:}
开局出门游戏跳出
游戏内读档跳出
大概是游戏内转场就会跳出 q345593023 发表于 2019-2-22 18:28
大佬厉害 有没有办法替换游戏里的字库 解决显示个别字显示不了的问题
字体补丁已经新鲜出炉!请转到我今天发的帖子下载!http://bbs.3dmgame.com/thread-5856425-1-1.html
大佬能不能出一个修改王者荣耀人物模型的教程 大佬,我发现一个问题。我玩术士转职龙术士,因为龙术士升级经常要选天赋,而天赋数量是有限的,一直双倍加下去很快就会没有天赋可以选,然后就升不了级。
我想把这部分,也就是天赋X2的这段改回来,无奈没学过代码,想不出来怎么改,求指导。
页:
[1]