Fork to ONScripter-Jh
- 修复高版本的 sdl 的音乐播放回调会取消音频播放(点击跳过上一个音频时会导致下一个音频无法播放)。
- 修复 osx 系统上无法编译
gbk
,shift-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 命令
- 自动播放会导致音频播放不完整。
- 使用
xmake
编译,支持windows
,osx
。 - 内置所有必须依赖,在 3rd 文件夹中,使用
xmake
编译。 - 日志加入使用的
render
和audio
的驱动。 -
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
指令,参考c
的sprintf
,示例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++17
的std::filesystem
的通用方法,移动端平台可能需要手动编写。 - 支持读取压缩包里的 ons 游戏,无需解压。
- 代码里描述指令说明并生成文档, onscripter-api, NScrAPI。
- 比较合并上游的 onscripter 的
20220816
版本 https://web.archive.org/web/20230205122538/https://onscripter.osdn.jp/onscripter-20220816.tar.gz。 - surface 支持 gpu 着色器缩放(静态内置)
- Magpie's Effect
- FSR-GLES-Demo
- 第三方着色器介绍
- opengl 支持
- dx11,dx12 支持
- metal 支持
预先工作
> 由于 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
看了代码以后才知道为啥只支持 gbk
,shift-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 病毒的感觉了。
名称 | 官网 | 商用 | 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),免费游戏的选择 |