LUCA System部分脚本指令推测解释 – 基于LBEE by Key实际脚本

前言

出于某种目的,我利用开源工具 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,其指令应该都大差不差。

那么,以上。

——— END ———

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇