Skip to content

zeromake/ONScripter-zero

Folders and files

NameName
Last commit message
Last commit date

Latest commit

8578f1e · Feb 13, 2025
Aug 26, 2024
Dec 8, 2023
Dec 9, 2023
Dec 28, 2022
Dec 8, 2023
Feb 13, 2025
Dec 6, 2023
Feb 13, 2025
Nov 10, 2023
Nov 30, 2023
Mar 5, 2024
Dec 3, 2023
Nov 4, 2022
Mar 5, 2024
Oct 19, 2022
Dec 1, 2023
Nov 27, 2023
Feb 13, 2025

Repository files navigation

ONScripter

Fork to ONScripter-Jh

bugfix

  • 修复高版本的 sdl 的音乐播放回调会取消音频播放(点击跳过上一个音频时会导致下一个音频无法播放)。
  • 修复 osx 系统上无法编译 gbkshift-jis 编码的 cpp 源码(使用 lua 脚本直接生成 \x 转义字符串)。
  • 修复 osx 上的 sdl 的 render 在高 dpi 模式下被放大了 dpi 的倍数导致文字渲染模糊(通过 oc 代码获得 dpi 倍数把 render 缩小)。
  • 修复在 osx 上的 savescreenshot 命令是向执行目录下写的,并修复脚本里的是 win 的风格路径。
  • 修复 windows 上调用外部播放器是同步阻塞的会导致游戏卡死,开了一个线程去调其系统命令。
  • 修复 android 下的 finger 触摸事件和鼠标点击事件冲突,android 的 sdl 官方模板触摸事件触发会同时触发 finger 和鼠标点击,手动在 c++ 这边适配了。
  • 修复触摸事件模拟点击效果不佳,点击的还是使用鼠标点击事件,去掉 finger 事件里的 mouseMove, mouseButton 的模拟(点击一下跑的没边了),finger 事件重写了两指和三指事件。
  • 修复 android 下的后台崩溃。
  • 修复并支持某些游戏的换页判断: 。]\\ 都是换页符号,现在会检查换页符号后 5 个字符是否还有换页符号,如果有跳过该换页符号。
  • 修复 android 的 aaudio 音频驱动方式有问题,会出现音乐断续,播放完一个以后会变正常,现在先切换到默认 openslES 后正常驱动。
  • 修复 android 下后台锁屏后黑屏,缺少画布大小变更事件监听后刷新绘制。
  • 修复 osx 上 simd 动画计算加速,xmake 的 add_vectorexts("avx2") 选项的 -mavx2 编译参数有奇怪的动画加载 bug,改用 -march=knl 就没事(黑苹果 bug)。
  • 修复各种奇怪的文字截断,主要是字体并非是正方形也不是等宽和等高的,但是 FontInfo 是完全以字体大小来计算偏移和精灵文字的绘制范围。
  • 修复文字带有描边会被截断,描边字体并未被算做绘制区域强制加上描边长度到绘制区域。
  • 修复 xmake 的 android 打包问题,新版 xmake 的依赖 api 有部分变化。
  • 修复 nt3 脚本解密不完全的问题。
  • 修复结束的文本不需要做强制点击换页。
  • 修复文本渲染里的变量替换无法支持别名的情况(初音岛1)。
  • 修复文本渲染有些游戏会做每行文本最后添加一个 / 符号,需要跳过该符号且跳过 processEOT 里的自动换行(3day)。
  • 修复方法调用的参数没有消费被渲染为文本。
  • 修复 getparam 的多余声明参数没有消费被渲染为文本。
  • 修复 playSound 里的 SDL_RW 没有正确回收。
  • 修复多层 for 的 break 无法正确的消费 next 命令
  • 自动播放会导致音频播放不完整。

feture

  • 使用 xmake 编译,支持 windowsosx
  • 内置所有必须依赖,在 3rd 文件夹中,使用 xmake 编译。
  • 日志加入使用的 renderaudio 的驱动。
  • language.lua 会把 src/language/*.txt 转换为带转义文字的 cpp 文件。
  • nscriptdecode 工具改为流模式,支持更多参数,支持三种的加解密(由于用的是 xor 模式即是加密也是解密)。
  • nsadec 工具支持 -out 设置输出目录, -lower 设置输出文件名是否为小写,-v 显示详细输出,默认也加入了进度查看。
  • 修复在 超级糖果ons 移植版的各种指令问题。
    • 添加 else, elseif, elif 指令,与 if, notif 指令配合使用。
    • 添加 sefadetime 指令,可以控制语音的淡入时间支持,播放一个语音后自动设置回 0。
    • 添加 checksp 指令,检查精灵是否显示。
    • 修改 csp 指令支持多参数,csp 1,10 代表清理 1-10 的精灵。
    • 添加 sprintf 指令,参考 csprintf,示例 mov %1,100:sprintf $1,"%d_xxx.jpg",%1,参数上限为 32 个。
    • 支持 onscript.nt 的脚步格式,支持版本 1-3。
  • 修改并支持 sdl2 的官方 android 模板
    • 参考面包工房写了一个启动页
    • 先使用 MANAGE_EXTERNAL_STORAGE 权限来读写 ons 目录
  • android 版完成。
  • 绘制画布在 android 上自动缩放到屏幕大小,否则字体渲染会发虚。
  • 支持对各种情况的字体进行单独设置
    • 描边支持设置描边颜色,和描边宽度。
    • 文本字体支持缩放比例。
  • 无需在编译脚本里指定 simd 使用的后端,simd/simd.h 会根据编译器预定义头自动选择后端,如果没有可用后端会自动关闭 simd 支持。
  • 文本渲染强制换行和切页,防止渲染到窗口外(配合自定义字体切换配置)。
  • 所有平台支持通过 ci 打包分发到 release。
  • 不再对文本里的单字节符号英文做特殊处理,支持中英混合,支持变量插入。
  • 强制对超过文本框的内容,做强制点击换页(有 bug 如果是和选项一起出现会导致点击换页事件抢掉选项事件注册)。
  • lua 的 NSCOM 调用现在可以在 ns 脚本里传入 int, string 参数
  • lua 的 NSSpLoad 支持传入位置 int 参数(可选),不用再调用一次 NSSpMove。
  • lua 增加一个 NSReadFile,用来支持读取 csv 文件之类的纯文本。
  • ns2 打包和解包工具支持 utf8 文件名打包(修复 unix 环境下无法解包带 gbk 的 nsa 文件),ons 引擎支持对该 ns2 的兼容读取,现在取文件会比较两次 gbk, utf8 的文件名。
    • ons 的内置 gbk 转码修正 utf8 到 gbk 不全的情况。
  • ons 的 trans_mode 默认为 AnimationInfo::TRANS_NONE。
  • ons trans_mode 添加 AnimationInfo::TRANS_MASK_{TOP,BOTTOM,LEFT,RIGHT} 用来替代 AnimationInfo::TRANS_ALPHA。
    • 写了第一个版本渲染有问题,等待修复。
  • ons 的 loadImage 做一个文件内容 lru 缓存,默认缓存 64 个图片内容。
  • ons 的内建纯色矩阵支持透明色,示例:>800,200,#ff00005a
    • 颜色支持 #fff, #ffff, #ffffff, #ffffffff 的类 css 变长写法(仅限在 sp 的 > 内建矩阵里有限)。
  • bg 支持加载带有透明颜色的图片,配合 clear_color 可以设置默认底色。
  • DirectReader 的多字节数字的读写方法改为 readLongBE, readShortBE, writeLongBE, writeShortBE
  • DirectReader 的多字节数字添加新方法 readLongLE, readShortLE, writeLongLE, writeShortLE
  • DirectReader 的多字节数字的读写方法会根据当前系统大小端进行自动优化(改为 memcpy)。
  • DirectReader 各个地方的调用都正确的使用 LE, BE 的方法。
  • 为 sp 添加新的图片处理器语法 @expr:param1 param2 param3……|expr:param1 param2 param3……
    • composite 参考 renpy 的 Composite,混合多张图片,示例 @composite:xxx.png[ dest.x dest.y][ src.x src.y src.w src.h]……
    • alpha,对图片做 alpha 效果,示例 @alpha:xxx.png 128 或者 @xxx.png|alpha:128
    • crop,对图片做矩形切割,示例 @crop:xxx.png 0 0 48 48 或者 @xxx.png|crop:0 0 48 48 (来自管道时不能再由 crop 加载图片)
    • 所有表达式支持管道式操作,前一个会的结果被作为后一个的输入
    • 需要重新处理 std::stringstream 对下一个输出的类型的判断方式,否则会导致 1.png 这个当作数字。
  • 为 for 添加 continue 指令支持(什么也不用做直接把 next 做一个 continue 别名即可)。
  • 文字渲染范围改为一个矩形坐标,不再使用横向纵向多少个字符的方式(设置依旧生效但是会转化为一个矩形坐标)。
  • 脚本全部切换到 utf-8 的处理,仅在读取时做 gbk,shift_jis 到 utf-8 转换。
  • 支持为字体设置多个 fallback 字体,并默认内置系统字体 fallback。
  • android 需要一个配置页面对游戏进行一个自定义或者全局配置。
  • 查找动画在 android 有明显卡顿的问题。
  • 抽象文件操作(文件读写,文件目录遍历,文件路径自动拼接,文件是否存在判断,目录创建),以便于移植到各种平台下,考虑使用 c++17std::filesystem 的通用方法,移动端平台可能需要手动编写。
  • 支持读取压缩包里的 ons 游戏,无需解压。
  • 代码里描述指令说明并生成文档, onscripter-api, NScrAPI
  • 比较合并上游的 onscripter20220816 版本 https://web.archive.org/web/20230205122538/https://onscripter.osdn.jp/onscripter-20220816.tar.gz。
  • surface 支持 gpu 着色器缩放(静态内置)

编译指南

预先工作 > 由于 freetype, harfbuzz 的循环依赖,请使用我的 xmake 分支,已经向 xmake-io 提出 issuse 了,但是维护者没有空处理,我这边只是一个比较简单的实现。

已经不需要手动处理最新版的 xmake v2.8.3 已经正常支持。

windows

需要安装 Visual Studio

xmake f -c -y
xmake build -y onscripter

windows by mingw

安装 llvm-mingw 或者其它 mingw 的版本。

$MINGW="D:\mingw64"
xmake f -p mingw --mingw=$MINGW -y -c
xmake build -y onscripter

osx

需要安装 xcode

xmake f -y -c
xmake build -y onscripter

android

需要 android sdk + ndk + jdk 顺便一提 luajit 需要编译机能编译 32 位的,所以 osx 编译不了 arm 的。

NDK_SDK=~/Library/Android/sdk/ndk/25.0.8775105
xmake f -p android -a arm64-v8a --ndk_sdkver=21 --ndk=${NDK_SDK} -y -c
xmake build -y onscripter
cd project/android
./gradlew assembleDebug
adb install ./app/build/outputs/apk/debug/app-debug.apk

吐槽

看了代码以后才知道为啥只支持 gbkshift-jis,这一种两字节编码的格式,代码里充满了大量的 IS_TWO_BYTE 判断,而且 ui 文字渲染也是走的这个逻辑,导致 ui 的文字必须也对应脚本的格式。 而且 ui 的文字里竟然还包含解析脚本的 token 关键字,所以说,ui 文字和 token 关键字需要拆开。

上游的 20220816 实际上已经支持了 utf8 不过在我看来还是有些无语(代码里全是 utf8 判断),我感觉直接在脚本载入阶段全部转为 utf8 代码除了读取脚本之外全部只适配 utf8会更简单。

顺便一提 GPLv2 的 ONScripter 天生不能商用(说是用了必须要以 GPL 开源就可以了,但是有哪个兄弟卖游戏还给大家分发游戏源码的),但是不和引擎打包在一起加密就是等于没有(虽然 ONScripter 的加密本身也和没有差不多了),必须要修改引擎去支持更高级的加密方式,所以 ONScripter 也就只能做成执行器去加载游戏了,开源加载器即可,天生就是给移植用的,IOS 那边的 ONSPlayer 闭源也不知道是不是找了 onscripter原开发者 买了商用授权。

商用的话比较活跃的就剩 renpy ,主要是 MIT 协议,有些库是 LGPL,有各种平台的支持。

还有就是 krkrz,windows 下还挺好用的,协议主要是 krkr 自定义的免责声明,和一把依赖库的协议多为 zlib bsd 之类的,手机的话虽然有 吉里吉里2模拟器 这种东西但是并不是全部开源的可以看看 Kirikiroid2#103 依赖库和打包全部没有,前面的 issue 有人搞了一个 Kirikiroid2 不过听说内存还是有问题。

看了 gpl,以后要是碰上 gpl 的库恐怕只会选择绕道走了,如果是直接面向用户的产品还可以考虑,库的话就有点真 gpl 病毒的感觉了。

avg 开源引擎比较

名称 官网 商用 pc mobile 文档 个人的评价
krkrz https://krkrz.github.io windows 没有统一的官网文档,大量的 kag 映射没用地方查 很强的一个引擎可惜没落了
renpy https://www.renpy.org windows,linux,MacOSx Android,IOS 有统一的渐进式的官方文档 未来之星 krkr 有力替代者
ONScripter https://onscripter.osdn.jp windows,linux,MacOSx Android,IOS 由于并没有特别的语法和插件,一个指令列表就足够了 超轻量级引擎(全静态 upx 后 2-3 mb),免费游戏的选择

参考资料