PM3GenScript(简称 PTS)基于 XSE 风格的脚本语言,但进行了诸多优化与魔改,提供了更多人性化的功能。以下是对 PTS 语言特性的详细介绍:
编译器宏(简称宏)为以 #
开头、由小写字母构成的伪指令(=
例外)。它不写入 ROM,但指示了编译器在编译期间的行为。
宏语句必须以 EOL 结尾(即单行只能存在一条宏)。
部分宏在编译期间将被提前解析,以提供对指令语句内定义符号、动态偏移参数等的完备检测,即:宏语句与指令语句之间并不是完全顺序执行的。如:
#org @1
checkflag 0x616
if B_YES goto @2
end
#dynamic 0xA00000
#define B_YES 0x1
#define
所定义的符号将对上方的脚本正常生效,因为它触发了宏提升;#alias
同样有这个效果。
#define
对符号的定义、#alias
对指令别名的定义、#dynamic
所指示的动态偏移起始地址等,都能够被同样作用的语句所覆盖而合并。如果在一段脚本中多次定义了同一个符号,将只有最后一条语句生效。
#include
能够将其他文件的部分可提升宏合并至当前脚本。它自身也是一条可提升宏。
指令由小写字母和数字构成,必须以小写字母开头。使用别名时,也支持出现下划线。
每条指令语句都由指令名(1 字节)与它所需的参数顺序组成,指令可以分为以下两种:
- 基础指令
- 复合指令
基础指令直接编译为十六进制数据,而复合指令会先转换为多条基础指令,然后再进行编译。
多条指令语句允许写在同一行。
指令的参数之间允许出现换行。
定义符号(简称符号)由大写字母、数字和下划线构成,必须以大写字母开头。符号需要使用 #define
来进行定义,它的值必须是至多 4 字节的数字。
动态偏移以 @
开头,由大小写字母、数字和下划线构成。它能够代替任何指针类型的参数,并在写入 ROM 时由程序自动寻找合适的空位。空位的起始地址由 #dynamic
指定。
不同脚本块之间不允许使用同一动态偏移名。
作为指令内的参数时,它必须指向文件内同名的脚本块。
数字为十进制或十六进制(以 0x
开头)的数字字面量。
数字必须为非负整数,不允许出现负号或小数点。
字符串为以双引号包裹的字符串字面量。
字符串内允许出现换行,但编译不通过。原因是游戏内存在多种不同类型的换行符,程序无法判断 \n
符号究竟指代哪种(\n
、\l
和 \p
),因此在需要时请显式填入(\
无需转义)。
即使将空字符串作为参数,也会在 ROM 中插入一个字节的 0xFF
。
本扩展内置中文字符集,可直接编译或反编译中文文本:
= "[文本色_07]你自己魔怔吧,\n我要去二次元了。"
如果需要直接插入十六进制的原始数据,可以在字符串中使用 \h
符号后接字节值:
= "[文本色_07]你自己\h09\h9D\h10\h6D吧,\n我要去\h03\hA3\h02\hAE\h0F\hB6了。"
PTS 支持 Javascript 风格的单行注释(//
)或多行注释(/* */
)。