3dmigoto ini 文件解析

# mod

3dmigoto中虽然已经有了非常详细的从如何捕获hash再到如何将模型应用到游戏中的详细教程,但是对于ini配置文件的描述却是不是很完整和具体 ,下面这篇文章将会系统地介绍一下3dmigoto的ini文件的涵义。

需要注意的是,3dmigoto的ini文件是 经过魔改的 ini 文件,其只是参考了ini文件的格式,但是并不是真正的ini文件。其拥有一定的自定义语法,但是我们还是从ini文件的基本语法开始介绍。

ini文件

什么是ini文件

ini文件是windows系统中的配置文件,用于存储程序的配置信息,其作用实际上和json,xml,yaml等配置文件是一样的,只是格式不同而已。

横向对比一下json和ini文件的区别:

1
2
3
4
5
6
7
8
9
10
{
"section1": {
"key1": "value1",
"key2": "value2"
},
"section2": {
"key3": "value3",
"key4": "value4"
}
}
1
2
3
4
5
6
7
[section1]
key1=value1
key2=value2

[section2]
key3=value3
key4=value

可以看到,json文件是以键值对的形式存储数据,而ini文件是以section和键值对的形式存储数据。json的每个大括号下都表示一个构造体,并且可以多层嵌套,而ini文件则是以section为单位,每个section下都是键值对。

ini文件的基本语法

section

ini文件以分节(section)的形式组织数据,每个section下都是键值对,键值对的形式为key=value,其中key是键,value是值。键值对之间用换行符分隔,section和键值对之间用中括号[]分隔。

比如:

1
2
3
4
5
6
7
[section1]
key1=value1
key2=value2

[section2]
key3=value3
key4=value

注释

ini文件使用分号;作为注释符号,分号后面的内容都会被忽略。

有的解析器还支持#作为注释符号,以及行内注释,但是这些都是非标准的写法。

比如:

1
2
3
4
[section1]
key1=value1 ; 这是注释(部分解析器支持)
key2=value2 # 这是注释(部分解析器支持)
; 这是注释

键值对

最基本的键值对的形式为key=value,其中key是键,value是值。键值对之间用换行符分隔。
ini还支持定义数组,数组的形式为key=value1,value2,value3,多个值之间用逗号分隔,或者使用 key[] 的形式定义数组。

比如:

1
2
3
4
5
[section1]
key1=value1,value2,value3
key2[]=value1
key2[]=value2
key2[]=value3

引号

ini文件中的值可以使用引号括起来,引号内的内容会被当做一个整体。

比如:

1
2
3
[section1]
key1="value1"
key2="value2"

3dmigoto ini文件

3dmigoto的ini文件是经过魔改的ini文件,其只是参考了ini文件的格式,但是并不是真正的ini文件。其拥有一定的自定义语法,下面我们来介绍一下3dmigoto ini文件的基本语法。

3dmigoto ini文件的基本语法

定义 变量

3dmigoto ini文件中的变量定义的形式为$变量名=值,其中$是变量的标志,变量名是变量的名称,是变量的值。

比如:

1
2
$var1=1
$var2=2

变量还可以拥各种修饰词,比如global persist等,这些修饰词会影响变量的作用域和生命周期。

1
2
3
4
global $var1=1
; global修饰词表示变量的作用域为全局,即可以跨越section以及文件进行访问
persist $var2=2
; persist修饰词表示变量的生命周期为持久,即变量的值会在游戏重启或者刷新时保持不变

定义函数,宏

3dmigoto ini文件中的函数定义的形式为[函数名],其中函数名是函数的名称,函数的内容为函数的实现。

你可以在别的section使用run关键字调用函数:run = 函数名

比如:

1
2
3
[func1]
$var1=1
$var2=2

你可以在函数内 调用复杂的逻辑,从而简化代码。

1
2
3
4
5
6
7
8
9
10
11
[func1]
if $var1==1
$var2=2
else if $var1==2
$var2=3
else
$var2=4


[section1]
run = func1

if else endif

3dmigoto ini文件中的条件语句的形式为if 条件,其中条件是条件表达式,else是条件不满足时执行的语句,endif是条件结束的标志。

比如:

1
2
3
4
5
6
7
if $var1==1
$var2=2
else if $var1==2
$var2=3
else
$var2=4
endif

跨文件访问

当变量定义为global时,可以跨文件访问。在别的文件夹中使用 $.\文件路径\文件名\变量名 即可访问。(不太确定 )

特殊section

在3dmigoto ini文件中,section的名称会影响其执行逻辑,下面是一些特殊section的名称:

[Constants]

这个section中定义的变量会在所有section中都可以访问,即全局变量。

[key……]

key开头的section表示这个section是一个按键绑定的section,其中XXX可以是任意的名称。

使用condition = 条件表达式来定义按键绑定的条件,只有当条件表达式为真时,这个section中的代码才会被执行。

比如:

1
2
3
4
5
6
[KeySwap]
condition = $active == 1
key = k
type = cycle
$swapvar = 0,1,2,3,4
$creditinfo = 0

这里定义了一个按键绑定的section,当按键k被按下时,且$active的值为1时,执行一个循环的操作,将$swapvar的值循环设置为0,1,2,3,4。$creditinfo指定是否展示信息,这里设置为否。

参数 说明
key 按键 指定任意一个按键作为触发按键,设置多个值时,只要有一个按键被按下,就会触发
type 操作类型 cycle/toggle/hold 分别表示 在多个值之间循环切换/在两个值之间切换/按住按键时执行操作
$swapvar 循环变量 在多个值之间循环切换
$creditinfo 是否展示信息 0/1 表示是否展示信息

[TextureOverride……]

TextureOverride开头的section表示这个section是一个纹理替换的section,其中……可以是任意的名称。

它默认有以下参数:

参数 说明 可选值 效果
hash 纹理hash 16进制数 指定要替换的纹理的hash值
format 纹理格式 DXGI_FORMAT 指定要替换的纹理的格式
width 纹理宽度 整数 指定要替换的纹理的宽度
height 纹理高度 整数 指定要替换的纹理的高度
mipLevels mipmap等级 整数 指定要替换的纹理的mipmap等级
$texture 纹理路径 字符串 指定要替换的纹理的路径
run 运行函数 函数名 指定要运行的函数
$active 是否需要激活 0/1 指定是否需要激活
checktextureoverride 检查纹理覆盖 ps/ib/vb 指定检查是否覆盖,如果已经覆盖则不再覆盖
vb 顶点缓冲 路径 指定要替换的顶点缓冲
ib 索引缓冲 路径 指定要替换的索引缓冲
ps-n 像素着色器 路径 指定要替换的像素着色器
handle 句柄操作 skip/replace 指定句柄操作
draw 绘制操作 二维数组 指定绘制操作
drawindexed 绘制索引操作 整数/auto 指定绘制索引操作

[CommandList……]

CommandList开头的section表示这个section是一个命令列表的section,其中……可以是任意的名称。

在这个section中,可以定义一系列的命令,比如说if else endif等。

其接受的参数有:

参数 说明 可选值 效果
handle 句柄操作 skip/replace 指定句柄操作

[Resource……]

Resource开头的section表示这个section是一个资源的section,其中……可以是任意的名称。

在这个section中,可以定义资源的种类,格式,路径等。

其接受的参数有:

参数 说明 可选值 效果
type 资源类型 texture/Buffer/indexbuffer/pixelshader 指定资源的类型
hash 资源hash 16进制数 指定资源的hash值
format 资源格式 DXGI_FORMAT 指定资源的格式
stride 资源步长 整数 指定资源的步长