3dmigoto ini 文件解析
3dmigoto中虽然已经有了非常详细的从如何捕获hash再到如何将模型应用到游戏中的详细教程,但是对于ini配置文件的描述却是不是很完整和具体 ,下面这篇文章将会系统地介绍一下3dmigoto的ini文件的涵义。
需要注意的是,3dmigoto的ini文件是 经过魔改的 ini 文件,其只是参考了ini文件的格式,但是并不是真正的ini文件。其拥有一定的自定义语法,但是我们还是从ini文件的基本语法开始介绍。
ini文件
什么是ini文件
ini文件是windows系统中的配置文件,用于存储程序的配置信息,其作用实际上和json,xml,yaml等配置文件是一样的,只是格式不同而已。
横向对比一下json和ini文件的区别:
1 | { |
1 | [section1] |
可以看到,json文件是以键值对的形式存储数据,而ini文件是以section和键值对的形式存储数据。json的每个大括号下都表示一个构造体,并且可以多层嵌套,而ini文件则是以section为单位,每个section下都是键值对。
ini文件的基本语法
section
ini文件以分节(section)的形式组织数据,每个section下都是键值对,键值对的形式为key=value
,其中key
是键,value
是值。键值对之间用换行符分隔,section和键值对之间用中括号[]
分隔。
比如:
1 | [section1] |
注释
ini文件使用分号;
作为注释符号,分号后面的内容都会被忽略。
有的解析器还支持#
作为注释符号,以及行内注释,但是这些都是非标准的写法。
比如:
1 | [section1] |
键值对
最基本的键值对的形式为key=value
,其中key
是键,value
是值。键值对之间用换行符分隔。
ini还支持定义数组,数组的形式为key=value1,value2,value3
,多个值之间用逗号分隔,或者使用 key[] 的形式定义数组。
比如:
1 | [section1] |
引号
ini文件中的值可以使用引号括起来,引号内的内容会被当做一个整体。
比如:
1 | [section1] |
3dmigoto ini文件
3dmigoto的ini文件是经过魔改的ini文件,其只是参考了ini文件的格式,但是并不是真正的ini文件。其拥有一定的自定义语法,下面我们来介绍一下3dmigoto ini文件的基本语法。
3dmigoto ini文件的基本语法
定义 变量
3dmigoto ini文件中的变量定义的形式为$变量名=值
,其中$
是变量的标志,变量名
是变量的名称,值
是变量的值。
比如:
1 | $var1=1 |
变量还可以拥各种修饰词,比如global persist等,这些修饰词会影响变量的作用域和生命周期。
1 | global $var1=1 |
定义函数,宏
3dmigoto ini文件中的函数定义的形式为[函数名]
,其中函数名
是函数的名称,函数的内容为函数的实现。
你可以在别的section使用run
关键字调用函数:run = 函数名
。
比如:
1 | [func1] |
你可以在函数内 调用复杂的逻辑,从而简化代码。
1 | [func1] |
if else endif
3dmigoto ini文件中的条件语句的形式为if 条件
,其中条件
是条件表达式,else
是条件不满足时执行的语句,endif
是条件结束的标志。
比如:
1 | if $var1==1 |
跨文件访问
当变量定义为global时,可以跨文件访问。在别的文件夹中使用 $.\文件路径\文件名\变量名
即可访问。(不太确定 )
特殊section
在3dmigoto ini文件中,section的名称会影响其执行逻辑,下面是一些特殊section的名称:
[Constants]
这个section中定义的变量会在所有section中都可以访问,即全局变量。
[key……]
以key
开头的section表示这个section是一个按键绑定的section,其中XXX
可以是任意的名称。
使用condition = 条件表达式
来定义按键绑定的条件,只有当条件表达式为真时,这个section中的代码才会被执行。
比如:
1 | [KeySwap] |
这里定义了一个按键绑定的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 | 资源步长 | 整数 | 指定资源的步长 |