前言
出于某种目的,我利用开源工具 LuckSystem 对 LUCA System 进行了一次逆向工程,从游戏 LBEE 的 SCRIPT.PAK 中提取出可读的 .txt 脚本指令。关于 LUCA System,这是Key社部分作品应用过的闭源游戏引擎,现在网上有很多工具如 LuckSystem / lbee-utils 方便对其进行逆向工程。在这里,我打算简要汇总一下其中常出现的脚本指令。
变量操作指令
- EQUN ( x , value ). 将变量$x$赋值为具体数值$value$。
- EQU ( x , expression ). 计算字符串形式的表达式$expression$的结果,再将结果赋给变量$x$。表达式比如 “10*#14001” / “#6011+1” / “#6466″,其中“#”号后跟着的就是一个变量。
- ADD ( x , #y ). 将变量$y$的值加到变量$x$上。
- RANDOM ( x , L , R ). 生成位于$[L,\, R]$的随机整数,再将其存入变量$x$。LBEE 的小游戏中涉及角色属性值,生成随机数可能是为了使每次游戏中角色的属性值产生微小偏移。
- FLAGCLR ( L , R , mask ). 顾名思义,该指令大概是用来批量清除标志位的,比如重置游戏状态,当然这只是推测出来的功能。它对编号位于$[L,\, R]$内的所有变量按某种规则进行清除标志位操作,具体规则取决于按位掩码$mask$。这里先用二进制表示编号位于$[L,\, R]$内的某个变量$x$和掩码$mask$,对于$mask$的每一位,如果为1,就将变量$x$中对应的这一位置为0,否则不变。实际执行的操作相当于 x = x & (~mask)。举个例子,观察出现过的$mask$的最大值应该是${(65535)}_{10}$,二进制表示为${(1111\, 1111\, 1111\, 1111)}_{2}$,所以推测变量和掩码都是按照16位来进行考虑,那么此时,当掩码每一位都是1时,变量每一位都置为0,相当于将变量归0。
画面控制指令
- HAIKEI_SET ( ). 用于清空画面图层。
- IMAGELOAD ( layer , image_id [ , mode , w , h ] ). 我也只敢说它是用来加载图片的,剩下的都是推测,因为找不到官方公开文档解释。参数不定,2 / 5 / … 个。第一个参数图层$layer$,不同数值可能用于区分背景、前景、人物立绘等;第二个参数是图片ID,作为资源索引;第三个参数可能用来形容不同模式;后两个参数究竟是先宽后高还是先高后宽也难说。
- DRAW ( p ). 大概是绘制图片的。
- DRAW ( t , effect_id ). 可能用于执行转场动画,类似PPT的切换效果。参数$t$为动画帧数,另一个自然就是转场效果ID。
- WAIT ( ). 等待当前绘制或转场动画完成。
- MOVE ( layer , x1 , x2 , y1 , y2 ). 将指定图层$layer$上的图片从$(x1,\, y1)$平滑移动到$(x2,\, y2)$,后4个参数的顺序还不是很确定。
- SHAKELIST ( p1 , p2 , p3 ). 使画面产生震动效果,参数可能控制振幅、频率、持续帧数等。
- CLOSE_WINDOW ( ). 关闭文本对话框,并清除对话框内的所有文字内容。
- INIT ( value ). 初始化操作。为什么把它归为画面控制指令呢?因为它好像总是跟以上指令共同出现。参数$value$应该是某个具体的初始值常量。
信息显示指令
- MESSAGE ( voice_id , Japanese_text , translated_text ). 在对话框中显示文本,并且带有语音。参数1即为语音ID,若该值为0,则表示无语音。参数2为日文原文,参数3为译文,原版LBEE可能译为英文,汉化版就译为中文。其中后两个参数形如 “`name@text”,相当于名字叫 name 的人说了句内容为 text 的话,当然,如果是内心独白的话,就只剩下 “text” 了。
- TALKNAME_SET ( p1 , p2 ). 设置当前说话角色的名字显示方式,通常用于特殊样式。
音频控制指令
- BGM ( music_id , mode ). 播放BGM,$mode$可能用于控制播放方式。
- BGM ( 0 , 0 , fade_frames ). 淡出当前BGM。所见到的三参数BGM指令,前两个参数好像都是0,第三个参数为淡出所需的帧数。
- SE ( sound_id , volume , 0x0 ). 播放一个音效。$volume$控制音量大小,第三个参数好像都是16进制0。
- SE_STOP ( sound_id ). 停止播放指定音效。
- VOLUME ( volume ). 调整全局音量。
控制流指令
- IFN ( condition , { goto label } ). 典型的条件判断指令,不过这里是 if_not。如果$condition$为假,则跳转到$label$处继续执行;否则按顺序执行下一行。
- GOTO ( { goto label } ). 无条件跳转到当前脚本中的$label$位置。
- GOSUB ( { goto label } ). 调用一个子程序,从$label$处开始执行。
- RETURN ( ). 从子程序返回。
- JUMP ( scene_id ). 直接跳转到另一个场景文件,不再返回当前脚本。解包 SCRIPT.PAK 后,会有许多 .txt 场景文件,即脚本文件。
- labelN. 作为跳转目标锚点,不执行任何操作。比如 label1: / label2: / … / label100: / …。
- FARCALL ( layer , scene_id , { goto scene_id globalN } ). 用于跨场景调用,它会跳转到另一个场景文件执行其中的脚本,执行完后返回到当前脚本的下一行继续执行,因此它与 JUMP 指令不同。其中参数$layer$可能用于区分嵌套调用层级。
- END ( ). 终止当前脚本的执行。通常出现在脚本最后一行。
特殊控制指令
- TASK ( task_id ). 启动一个游戏内部任务。结合LBEE,可能是各类小游戏。
- EX ( … ). 执行外部命令。
- VARSTR ( p1 , p2 , p3 ). 用于执行字符串变量操作,如赋值、比较、拼接等。
这只是一部分能够大致推测出功能的指令,根据LBEE推测。
当作参考就好,无论是什么System,其指令应该都大差不差。
那么,以上。